2011-02-15 192 views
1

這個問題對於那些和我不同的人來說,真的是瞭解可可應用程序中的多線程。這裏有一個簡單的情況是:好吧,從其他後臺線程啓動後臺線程? (NSObj)

現狀:
我的應用程序通過使用NSObject的提供的方法實現了併發性。請告訴我,如果它是好的,做到以下幾點:

1)我的主視圖控制器啓動在後臺的一些工作,以騰出UI:

​​

2)背景的工作把它的任務分成更多的後臺線程幾個較小的任務,以便爲它完成每個任務被更新(而不是當所有任務完成):

[self performSelectorInBackground:@selector(loadOneImage:) withObject:nil]; 

理由:
這是我可以發明的唯一方法來完成單個任務(加載/繪製自定義UIViews)在UI中更新的每個完成。否則,當組中最後一項任務完成時,所有任務纔會更新...

回答

3

是的,您可以使用performSelectorInBackground:...調用來從輔助線程產生輔助線程。

如果你有很多線程產生(以這種方式),請考慮一個NSOperationQueue。否則,你可能會得到大量的後臺線程。 100個線程(例如),每個在移動設備中加載一個圖像都不是很好的資源利用 - 也不會對其進行響應。 NSOperationQueue允許您限制最大數量的線程/工作者,並重用工作者線程。

注意:'100線程'被使用,因爲這個數字遠遠超出了硬件的邏輯(這個問題被標記爲iPhone)。如果你的圖像加載全部在內存中,只需使用一個序列(一次一個工作人員)NSOperationQueue - NSOperations可以指定優先級。如果圖像正在被下載,那麼你可能想要堅持到4或更少。

OS X上的情況有所不同,因爲OS X上有更多可用的內核和資源,所以這些數字會隨着硬件平臺的變化而變化。在OS X上,您可以在一個應用程序中成功使用100個線程,不過在大多數應用程序的多線程附近需要任何東西是不尋常的。

+0

感謝您的支持。次要線程方法現在工作正常,但同時發生了很多事情 - 這使我的UI有點呆滯。所以我會研究NSOperationQueue,看看它是否有什麼不同。 – m0rtimer 2011-02-15 09:27:26

1

就我所見,這種方法沒有任何問題。根據文檔,performSelectorInBackground:withObject:只是產生另一個線程,並在那裏執行你的選擇器。它沒有列出任何限制。只要不要忘記在通過performSelectorInBackground:withObject:調用的每種方法中設置自動釋放池,以避免泄漏任何內存。

+0

感謝您的回答Darkdust。很高興知道我還在安全區。儘管如此,我仍然需要檢查NSOperationQueue是否提供了真正的性能優勢。 – m0rtimer 2011-02-15 09:25:07

1

你應該確定一個關鍵條件。兩個在後臺運行的線程都不應該有任何依賴關係。如果他們有,那麼你最終可能會不一致。

因此,如果你去操作隊列,而不是從另一個後臺線程產生線程,