2010-08-17 60 views
0

下面是WWDC 2010屆208幻燈片:在iOS主線程的runloop vs bg線程的runloop中調度異步下載?

conn = [[NSURLConnection alloc] initWithRequest:req 
    delegate:self startImmediately:NO]; 
[conn scheduleInRunLoop: [NSRunLoop currentRunLoop] 
    forMode: NSDefaultRunLoopMode]; 
[conn start]; 

是否有與安裝多塊康涅狄格州的在currentRunLoop相關的問題?

在後臺線程的runloop中調度NSURLConnection有什麼好處?

謝謝!

回答

2

您使用短語「secondary runloop」表示您不知道運行循環是什麼。

NSRunLoop是一個線程的「主循環」的實現。或多或少,

while ([runLoop waitNextEvent]) { 
    NSAutoreleasePool * pool = [NSAutoreleasePool new]; 
    [runLoop handleEvent]; 
    [pool release]; pool = nil; 
} 

運行循環有一個線程。每個線程至多有一個運行循環。 「performSelectorOnMainThread」會在運行循環中安排它,但程序員通常會談論線程,而不是運行它所使用的任何循環抽象,因爲它們都是一樣的。並非所有的線程都有運行循環(NSThread的函數通常會給你一個沒有運行循環的線程;我認爲如果你需要的話你必須自己創建運行循環)。

「currentRunLoop」是當前正在執行的線程的運行循環。這是或許是的主線程,除非你使用過NSOperation/dispatch _ */etc。如果你安排在另一個線程上,然後(我認爲)委託回調從另一個線程運行。你可能不希望發生這種情況。

現在,線程。

產生大部分時間處於空閒狀態的後臺線程沒有多大意義。 NSURLConnection的處理應該很少(首先,你不能在手機中獲得這麼多的帶寬);在主運行循環中運行它幾乎沒有任何開銷;線程往往會有更大的開銷。

如果您正在處理數據,並且處理是CPU密集型的,那麼您可能希望它在後臺線程中運行。您可能會將連接放置在後臺線程中,但通常在主線程中儘可能多地執行。

我不會開始處理線程間通信問題,因爲它們是一個主要的難題。只有在知道需要時才使用併發性。

(而直到iPhone進入雙核,你幾乎肯定不需要爲你寫的代碼的99%。)

+0

如果我要下載30 + JPEG的一排,它使感覺維護一個後臺線程並追加10 x NSURLConnection的bg線程的runloop?那麼後臺線程是否可以直接操作模型,並且主線程使用KVO來更新視圖? – Henry 2010-08-17 04:40:46

+1

UIKit不是特別的線程安全;我不知道' - [UIImage imageWithData:]'是否可以安全地從後臺線程調用。據我所知,KVO通知也在導致修改的線程中運行;你需要做顯式的「performSelectorInMainThread:」或者等價的做到這一點。再次,*線程是不值得的,除非你有性能問題*。 – 2010-08-17 13:36:10

+0

CurrentRunLoop類方法返回與當前線程關聯的runLoop,並在必要時創建一個(當前線程不存在) – VdesmedT 2010-09-27 16:27:34