2009-11-21 32 views
0

在CocoaXMLParser類蘋果CocoaXMLParser例如,出現以下代碼:運行循環和線程在蘋果的CocoaXMLParser例如

rssConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
[self performSelectorOnMainThread:@selector(downloadStarted) withObject:nil waitUntilDone:NO]; 
if (rssConnection != nil) { 
    do { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } while (!done); 
} 

按照NSRunLoop文檔「在一般情況下,你的應用程序並不需要或者創建或者顯式管理NSRunLoop對象,每個NSThread對象(包括應用程序的主線程)都有一個NSRunLoop對象,根據需要自動爲它創建。在此情況下,爲什麼在此示例中顯式管理運行循環?它是否不會由NSURLConnection請求生成的線程自動創建和銷燬?

回答

2

在該代碼中,運行循環基本上被告知永遠運行,以便該線程可以繼續處理來自NSURLConnection的傳入背景數據。即使爲您創建了運行循環,默認情況下,該線程在該方法結束時會終止。

一般來說,當做這樣的事情時,將所有內容放入NSOperation然後放入NSOperationQueue會更容易(儘管如果要實現NSUrlConnection回調,您必須在NSOperation類中提供一些額外的方法)。

+0

謝謝,你是說,在調用connectionDidFinishLoading方法之前,線程(在本例中爲NSURLConnection)可能會終止? – RunLoop 2009-11-21 18:15:36

+0

的確,事實上我在現實生活中碰到過這個確切的問題 - 你打開一個有效的連接,然後connectionDidFinishLoading永遠不會被調用......也不是像didReceiveData這樣的其他方法。在這種情況下,您嘗試加載的後臺線程在URL連接之前終止甚至可以執行任何操作。 – 2009-11-22 04:54:35

相關問題