2

我只是想知道在NSOperationQueue所擁有的NSOperation上執行completionBlock的具體時刻。在NSOperation上執行完成塊是在哪一刻?

在我的最新項目Amazon S3的客戶端(https://github.com/StudioIstanbul/SIAFAWSClient)上,我使用帶有completionBlock的NSOperation來處理對Amazon REST API的請求。客戶端可以通過名爲isBusy的主類上的屬性來監視所有預定請求的狀態。在我的操作的完成塊中,如果在我的NSOperationQueue中沒有安排其他操作,我將此屬性的值設置爲NO。我現在發現,在少數情況下,當CompletionBlock被調用時,我的當前NSOperation仍然包含在我的NSOperationQueue中。這對我來說似乎有點奇怪。我最終在隊列中檢查了當前NSOperation的存在以解決這個問題,但從設計的角度來看這似乎沒有必要。

__weak AWSOperation* thisOperation = operation; 
[operation setCompletionBlock:^{ 
    if (self.operationQueue.operationCount <= 0 
     || (self.operationQueue.operationCount == 1 
     && [self.operationQueue.operations objectAtIndex:0] == thisOperation)) { 
     [self willChangeValueForKey:@"isBusy"]; 
     _isBusy = NO; 
     [self didChangeValueForKey:@"isBusy"]; 
    } 
}]; 

有沒有人有關於此行爲的更多信息?

回答

0

從文檔:

爲您完成塊的確切執行上下文不能保證,但通常是一個輔助線程。因此,您不應該使用此塊來執行任何需要特定執行上下文的工作。

因此,您不能保證在將操作從隊列中移除之前或之後調用它。它是在觸發器之後發送的,以便從隊列中移除操作(因爲操作已完成),但在這兩件事之間實際上存在競爭。

如果您詢問操作隊列本身以確定狀態,您最好的選擇是將您的考慮推到主循環的下一個迭代中。

+0

但是這並不是說它不能保證在拆除手術後運行。我也很驚訝。 –

+0

它明確表示不能保證它的運行時間,因爲它將運行的線程不能保證 – Wain

+0

是的,但是在運行的任何線程上,它可以在刪除後啓動。 –

相關問題