您使用短語「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%。)
如果我要下載30 + JPEG的一排,它使感覺維護一個後臺線程並追加10 x NSURLConnection的bg線程的runloop?那麼後臺線程是否可以直接操作模型,並且主線程使用KVO來更新視圖? – Henry 2010-08-17 04:40:46
UIKit不是特別的線程安全;我不知道' - [UIImage imageWithData:]'是否可以安全地從後臺線程調用。據我所知,KVO通知也在導致修改的線程中運行;你需要做顯式的「performSelectorInMainThread:」或者等價的做到這一點。再次,*線程是不值得的,除非你有性能問題*。 – 2010-08-17 13:36:10
CurrentRunLoop類方法返回與當前線程關聯的runLoop,並在必要時創建一個(當前線程不存在) – VdesmedT 2010-09-27 16:27:34