2011-06-05 38 views
1

我正在試圖讓多個NSURLConnections並行(同步)運行,但是如果它沒有在主線程(代碼塊註釋如下)上運行,那麼URL連接不會運行t看起來可以工作(沒有任何NSURLConnection委託方法被觸發)。下面是代碼我有(一的NSOperation子類的實現文件):獲取多個NSURLConnections並行運行的問題

- (void)start 
{ 
    NSLog(@"DataRetriever.m start"); 
    if ([self.DRDelegate respondsToSelector:@selector(dataRetrieverBeganExecuting:)]) 
     [self.DRDelegate dataRetrieverBeganExecuting:identifier]; 

    if ([self isCancelled]) { 
     [self finish]; 
    } else { 

     /* 
     //If this block is not commented out NSURLConnection works, but not otherwise 
     if (![NSThread isMainThread]) 
     { 
      [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO]; 
      return; 
     }*/ 

     SJLog(@"operation for <%@> started.", _url); 

     [self willChangeValueForKey:@"isExecuting"]; 
     _isExecuting = YES; 
     [self didChangeValueForKey:@"isExecuting"]; 

     NSURLRequest * request = [NSURLRequest requestWithURL:_url]; 
     _connection = [[NSURLConnection alloc] initWithRequest:request 
                 delegate:self]; 
     if (_connection == nil) 
      [self finish]; 
    } //not cancelled 


}//start 

通過它跑了一個調試器,以及NSURLConnection的這種啓動方法沒有代表觸發結束後(我設置斷點那裏)。但在主線程上,它工作得很好。有什麼想法嗎?謝謝!

回答

3

後臺線程不會自動在其上有active run loop。創建NSURLConnection後,您需要啓動運行循環以獲取任何輸入。幸運的是,這很簡單:

[[NSRunLoop currentRunLoop] run]; 

當你說你正在同步運行連接時,你是不正確的。 NSURLConnection的默認模式是異步的 - 它爲您創建並管理一個新的後臺線程,並在原始線程上調用委託。因此,您不必擔心阻塞主線程。

如果您確實想要執行同步連接,您可以使用sendSynchronousRequest:returningResponse:error:,它將直接返回數據。詳情請參閱"Downloading Data Synchronously"

+0

這樣做了,謝謝! – Stunner 2011-06-05 04:01:48

1

NSURLConnection需要一個活動的運行循環來實際工作;確保這個最簡單的方法就是從主線程運行它。

請注意,NSURLConnection通常是異步運行的(如果你同步運行一個,它真正做的是在另一個線程上異步運行一個,然後阻塞直到完成),所以除了你在委託方法中做的任何處理,對UI響應性沒有多大影響。

+0

所以不可能讓主線程啓動它並讓後臺線程負責NSURLConnection委託方法?因爲在我的應用程序中,它非常明顯,因爲我的視圖中的其他項目不會加載(它們需要大量計算),直到完成NSURLConnections。如果我可以採取一些困難的方法來實現這一目標,或者我喜歡這個遊戲。 – Stunner 2011-06-05 03:52:49

+0

你*可以*使用後臺線程,如果你運行一個運行循環。或者你也可以使用委託方法中的'performSelectorInBackground:withObject:'來激發密集型任務。 – Anomie 2011-06-05 05:00:20