2009-10-29 33 views
16

我想使用NSOperationQueue設置一個序列化的任務隊列,但我對文檔中討論的術語有點困惑。NSOperationQueue和併發與非併發

在一個的NSOperation 對象的上下文中,併發的條款和 非併發不一定 指並排側執行的 線程。相反,非併發的 操作是使用 執行的環境,它是爲 提供的環境,而並行操作是 ,負責設置其自己的 執行環境。

什麼意思建立「自己的運行環境「?

我的NSOperation派生的任務需要在它們被添加到隊列的順序依次執行。

因此,我認爲,這意味着一個'非併發'的操作,所以我會爲需要完成的工作實現'main',並返回'isConcurrent'的NO。另外,NSOperationQueue的'setMaxConcurrentOperationCount'將被設置爲1。原因我沒有設置NSOperation依賴這些任務之間的關係是因爲他們被插入到隊列中的順序是他們應該完成的順序。

這些假設是否正確?

回答

23

NSOperationQueue始終同時執行操作,同時考慮相關性。

「非併發」操作需要單獨的線程才能併發執行。 NSOperationQueue負責提供此線程。換句話說,非併發操作取決於NSOperationQueue以使其成爲併發操作。

「併發」操作本身併發;它不需要NSOperationQueue爲它創建一個線程。一個例子是使用異步文件IO的操作。

如果您想要連續執行兩個或多個操作,則需要使用依賴關係。

如果您想要阻止主線程的操作,請不要使用NSOperationQueue;只需在主線程上依次運行每個操作。

要手動設置最大併發操作,使用方法上operationQueue setMaxConcurrentOperationCount:

+9

如果您將NSOperationQueue上的MaxConcurrentOperationCount設置爲1,則不一定需要使用依賴項。按照我的經驗,它按照它們添加到隊列中的順序處理操作。但是,您可以設置依賴項以保證安全。 – 2009-10-30 04:06:18

+10

該文檔指出,將最大計數單獨設置爲1不能保證FIFO順序。 NSOperationQueue也考慮到優先事項和一些其他事情來確定順序。 – 2013-04-03 07:19:51

1

你真的需要子類NSOperation嗎?爲什麼不使用NSInvocationOperation及其addDependency:方法?

請參閱我的回答this SO question

+0

所以NSInvocationOperation是輕量級的任務,在那裏創建一個子類是大材小用。但什麼是「自己的運行環境」? – 2009-10-29 23:17:05

+0

有趣的是,這個措詞不在最新版本的文檔中(參見下面的鏈接)。我相信,措辭是指你需要做的任何設置關於線程創建。 https://developer.apple。com/iphone/library/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html – nall 2009-10-29 23:32:53

+0

以前的文檔中的這句話看起來很相關:在start方法中,您必須準備執行的操作,其中包括爲您準備運行時環境操作。 (例如,如果你想自己創建一個線程,你可以在這裏完成。)一旦你的運行時環境建立起來,你可以調用任何方法或函數來隨後啓動你的操作。 – nall 2009-10-29 23:35:44