2013-05-06 65 views
1
[oqlMyOperationQueue cancelAllOperations]; 

PO([oqlMyOperationQueue operations]); 

我仍然在那裏看到一堆操作。爲什麼取消所有操作不會刪除所有操作?

2013-05-06 16:05:38.559 [oqlMyOperationQueue operations]: (
    "<NSBlockOperation: 0x20222730>", 
    "<NSBlockOperation: 0x2041f7a0>", 
    "<NSBlockOperation: 0x20450830>", 
    "<NSBlockOperation: 0x20417bf0>", 
    "<NSBlockOperation: 0x2006d510>", 
    "<NSBlockOperation: 0x2000d150>", 
    "<NSBlockOperation: 0x20379810>", 
    "<NSBlockOperation: 0x2021f8f0>", 
    "<NSBlockOperation: 0x2045dca0>", 
    "<NSBlockOperation: 0x2024c670>", 
    "<NSBlockOperation: 0x2041b8e0>", 
    "<NSBlockOperation: 0x203d54a0>", 
    "<NSBlockOperation: 0x20442c80>", 
    "<NSBlockOperation: 0x20452930>", 
    "<NSBlockOperation: 0x20363af0>" 
) 

但是我已經取消了所有操作。所以有什麼問題?

好吧我知道如果一個操作已經在執行,那麼這個操作將保留在隊列中。但爲什麼還剩這麼多?隊列是串行的。

回答

2

docs(重點煤礦):

這種方法發送當前在隊列中的取消消息至所有操作。排隊的操作在開始執行之前被取消。 如果某個操作已在執行,則該操作可以識別取消並停止正在執行的操作。

+0

如果操作在開始執行之前被取消,他們在排隊的塊中做什麼? – 2013-05-06 09:19:43

+0

@SeptiadiAgus操作本身可以決定它是否要服從取消與否。想想取消更多的作爲它應該不完成(甚至開始)它的任務的暗示。 – JustSid 2013-05-06 09:31:56

5

引述NSOperationQueue documentation

此方法在 隊列發送一個取消消息至所有操作目前。排隊的操作在開始執行之前被取消。如果 某個操作已在執行,則該操作將由 確認取消並停止正在執行的操作。

cancelAllOperations不清除隊列,而是通知隊列中當前正在取消的所有操作。爲了進一步從DOC(重點煤礦)引述:

您不能直接從隊列中已經添加後刪除的操作。操作保持在其隊列中,直到它報告它已完成其任務。完成其任務並不一定是 意味着操作完成該任務。 操作也可以取消。 取消操作對象將 中的對象留在隊列中,但通知對象它應儘快中止其任務 。

+0

那麼如何清除隊列? – 2013-05-06 09:19:12

+1

@SeptiadiAgus來自同一個文檔'添加後,你不能直接從隊列中刪除操作。你應該創建一個新的NSOperationQueue。 – 2013-05-06 09:22:41

+0

@JustSid請更新您的答案,並附上上面的文檔鏈接。 – 2013-05-06 09:23:21

0

要回答這個評論

那麼如何清除隊列呢?

小類NSOperation。添加一個條件來檢查操作是否在開始時以及在執行數據調用以獲取圖像或操作正在執行的任何冗長任務之前被取消。

if (!self.isCancelled) 
    // then do something 
else 
    return; 

如果操作不涉及多個數據呼叫,它能夠更好地每次通話前添加檢查。這應該會阻止當前操作進一步執行。隊列中剩下的操作也將停止。

相關問題