2010-06-15 54 views
29

目前我使用NSThread緩存在另一個線程的圖像。NSThread與NSOperationQueue vs. ???在iPhone上

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image]; 

或者:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image]; 

或者,我可以使用NSOperationQueue

NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image]; 
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init]; 
[opQueue addOperation:invOperation]; 

是否有任何理由從NSThread轉走呢? GCD在iPhone上發佈時是第四種選擇,但除非有顯着的性能提升,否則我寧願堅持適用於大多數平臺的方法。


基於@喬恩 - 埃裏克的建議下,我去了NSOperationQueue/NSOperation子類的解決方案。它工作得很好。 NSOperation類非常靈活,您可以根據需要將它與調用,塊或自定義子類一起使用。無論您如何創建您的NSOperation,只要您準備好運行,就可以將其放入操作隊列中。如果需要,這些操作可以用作放入隊列中的對象,也可以作爲獨立的異步方法運行。由於您可以輕鬆地同步運行自定義操作方法,因此測試非常簡單。

我用在項目屈指可數此相同的技術,因爲我問這個問題,我不能與它讓我的代碼和我的測試中清晰有序,並愉快地異步的方式快樂。

一個++++++++++ 會繼承再次

+0

你可以分析他們每個人。那將是找出答案的方法之一。 – 2010-06-15 01:30:39

+0

表現是錯誤的詞,我懷疑它們在下面都是一樣的。我更想找一個有兩種或兩種以上這些方法的經驗的人來給我一些關於首選方式和爲什麼更好的建議。 – kubi 2010-06-15 01:47:07

回答

32

一般來說,你會得到更好的里程與NSOperationQueue

三個具體原因:

  • 您可能需要一次啓動許多項目的緩存。 NSOperationQueue足夠聰明,只能創建與核心數量相同的線程,排隊其餘的操作。與NSThread,創建100個線程來緩存100個圖像可能是過度殺毒,並且效率有點低。
  • 您可能要取消cacheImage操作。通過NSOperationQueue實現取消更容易;大部分工作已經完成了。
  • NSOperationQueue可自由切換到一個更加智能地執行(如大中央調度)現在還是將來。 NSThread更可能永遠只是一個操作系統線程。

獎勵:

  • NSOperationQueue有其它的一些結構內置,比如尊重操作優先級和依賴的複雜的方式。
+0

假設你不需要額外的NSOperationQueue提供,爲什麼創建100個NSThreads效率低下?或者你是否假設如果需要創建100個線程,那麼一定需要一些NSOperationQueue好處? – Tony 2011-05-08 01:53:52

+4

@Tony:創建線程非常昂貴。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html – kubi 2011-07-28 12:59:04

5

我會用NSOperationQueue。在OS 3.2下,NSOperationQueue在引擎下使用線程,所以這兩種方法應該類似地執行。但是,在Mac OS 10.6中,NSOperationQueue使用GCD,因此具有不佔用單獨線程的開銷。我沒有看過的文檔OS 4的,但我懷疑它做類似的東西 - 在任何情況下,NSOperationQueue可以交換的實現,如果/當GCD的性能優勢成爲可用於iPhone。