2010-10-04 79 views
1

嗨我想創建一個NSOperaion隊列下載一堆PDF文件。但它不起作用。委託方法不會被調用NSURLConnection,因爲我把它們放在NSOperation隊列....任何替代或解決方案?與NSOperationqueu NSURLConnection問題

- (void) loadData { 
NSOperationQueue *queue = [NSOperationQueue new]; 
NSInvocationOperation *operation; 
for(int i=0;i<[self.pdfArray count];i++){ 
    NSString *url = [NSString stringWithFormat:@"http://www.somelink.com/%@.pdf",[self.pdfArray objectAtIndex:i]]; 
    operation = [[NSInvocationOperation alloc] initWithTarget:self 
       selector:@selector(loadDataWithOperation:) 
       object:url]; 

    [queue addOperation:operation]; 
    [operation release]; 
} 
} 

- (void) loadDataWithOperation:(NSString *) url{ 

// Create the request. 

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url] 
      cachePolicy:NSURLRequestUseProtocolCachePolicy 
      timeoutInterval:60.0]; 

    NSURLConnection *theDownload = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 
} 
+0

您是否在您的loadDataWithOperation方法中放置了斷點或調試輸出以驗證它沒有被調用? – Greg 2010-10-04 20:11:47

+0

是啊,這就是所謂...唯一的問題是,當我將它添加到nsoperationqueue它不起作用 – vivianaranha 2010-10-04 20:13:13

+0

是否正確創建了下載? (你沒有從init返回nil。)你不應該,但是調用''[theDownload start]'有什麼區別? – 2010-10-04 20:36:34

回答

1

我真的看不出代碼有問題,但它可能是一個線程問題。 NSOperationQueue通過Grand Central Dispatch創建一個線程來運行該操作。如果NSURLConnection然後也嘗試創建一個線程它可能會導致一個問題 - 我不知道一個線程可以是一個子線程的子。

你可以做一個sendSynchronousRequest:使它保持在你在NSOperationQueue中創建的線程中,看看它是否更好。

0

NSURLConnection的,需要一個磨合NSRunLoop的功能。如果您在NSRunLoop未運行的線程上調用NSURLConnection方法,NSURLConnection將永遠不會運行。 NSOperationQueue創建的工作線程沒有運行NSRunLoops。你也不能保證當NSURLConnection從服務器收到響應時線程仍然存在。

這是好的調用從後臺線程NSURLConnection的方法,但它需要一個線程,其壽命可以保證,它需要有它NSRunLoop運行。