1

瞭解NSURLConnection的我做一個隊列更好地NSOperationQueue

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 

我的隊列發送到我的異步請求

[NSURLConnection sendAsynchronousRequest:req queue:operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // ... do stuff here 
    }); 
}]; 

取消我的行動過早

[operationQueue cancelAllOperations]; 

然而,我可以看到我的異步的「完成」代碼仍在運行。這種情況怎麼會不像我預期的那樣工作?

回答

1

是否有責任在操作任務期間檢查isCancelled以防半途取消操作?

NSOperationQueue不會只是殺死任務,它會將它們設置爲取消並讓它們自己完成。這可讓您在退出之前清理可能已分配並整理的所有資源。

尚未開始的任務將無法啓動。

+0

如何從我的塊中檢查isCancelled?我沒有參考該操作,並且'self'已被這個點「取消」了,因爲當'self'被訪問時,我在我的塊中獲得了一個'EXC_BAD_ACCESS'。 – Jacksonkr

+0

啊,是的。這是一個問題。雖然你的完成處理程序肯定會在主線程中,所以你根本不需要神? – deanWombourne

+1

「根本不需要神」我不確定你的意思..聽起來太虔誠,對於這個convo :) – Jacksonkr

1

cancelAllOperations遍歷隊列中的項目並在每個項目上調用cancel。如果你看一下文檔completionBlock

您提供的竣工塊當由isFinished方法變爲是返回的值執行。因此,該塊在操作的主要任務完成或取消之後由操作對象執行。

可以看出here

編輯:

從文檔中另一個片斷的setCompletionBlock:

完成的操作可以完成是因爲它被取消或者是因爲它成功地完成了它的任務。在編寫代碼時,你應該考慮到這個事實。同樣,你也不應該假設成功完成依賴操作,而這些操作本身可能已被取消。