我有一個NSOperationQueue的NSOperation,有一堆子操作,有些排隊。NSOperation。取消與完成狀態
我有一個問題,即使在隊列上調用cancelAllOperations後,我的主要方法掛在waitUntilAllOperationsAreFinished上。
然後,當我設置完成標誌,我使用isFinished取消後不再備份在取消隊列中。
- (BOOL)isFinished
{
return complete;
}
- (void)cancel
{
cancelled = YES;
complete = YES;
[_childOperationQueue cancelAllOperations];
}
這是正確的行爲,取消的操作應該在技術上完成? 看起來NSOperation需要將isFinished設置爲true,然後才能將其刪除,因爲這可能允許它「清理」,但我不知道協議在這裏,Google沒有透露太多內容。
您確定您的操作實際上取消了嗎?告訴它取消不會立即取消它,它只是告訴它應該取消它自己的塊。你需要真正檢查'self.cancelled'並放棄你的操作。您不應該重寫'isFinished'或'cancel' - 兩者的默認行爲都應該起作用。 –
@AbhiBeckert如果編寫一個非併發操作,你是對的。但是在編寫併發操作時,你總是重寫'isFinished'方法(顯式地或者自動合成的getter)。此外,重新取消,雖然我同意你一般不會重寫,但是定期檢查'isCancelled',有時你不能這樣做。例如,如果你啓動一個基於塊的'NSURLSessionTask',就沒有你可以檢查'isCancelled'的位置,所以你將在這種情況下覆蓋'cancel'方法。 – Rob