2012-07-10 47 views
3

我有一堆NSOperations添加到NSOperationQueue。操作隊列的maxConcurrentOperationCount設置爲1,以便NSOperations一個接一個地運行。NSOperations及其completionBlocks是否同時運行?

如今,在NSOperation我想通過在NSOperationQueue調用cancelAllOperations取消所有未決NSOperationscompletionBlock

這樣做是否安全?我是否可以確定只有在前一個操作的completionBlock已完全執行後纔會調用下一個操作的start-方法?或者執行前一個操作的completionBlock和當前操作的任務是否同時運行?

我之所以問:我使用AFNetworking來執行一批AFHTTPRequestOperations,並希望只有當該批次的所有先前請求都成功時才執行一個請求。

回答

4

我的調查結果似乎不再是真實的。我已經在iOS 8和iOS 9上重新運行測試,並且操作的完成塊始終與下一個操作同時運行。目前,我沒有看到讓操作等待上一個完成塊完成的方法。


我剛剛在示例項目中嘗試過這種情況。下面是結果:

如果NSOperationQueuemaxConcurrentOperationCount被設置爲1,一個NSOperationcompletionBlock和在隊列中運行的下一個NSOperation同時。

但是,如果每個NSOperation通過調用addDependency:鏈接到其以前的操作,操作的執行等待,直到前面的操作的completionBlock已完成。

所以,如果要取消當前操作的completionBlock下一個操作,並確保它被取消開始之前,你必須設置NSOperations之間的依賴關係,通過調用addDependency:

+0

大分析!剛剛經歷過同樣的事情。 – Klaas 2015-07-22 10:39:59

+0

這似乎並不真實,至少不適用於iOS 9.我有一個完成塊,我可能要取消依賴操作,但通常在完成塊運行之前已經開始執行。 – Accatyyc 2016-02-15 16:31:13

+0

你是對的,我重新運行了我的實驗,現在完成塊和下一個操作總是並行運行。 – Tom 2016-07-01 14:05:57