2012-01-18 32 views
0

我有ASINetworkQueue,其中有超過1500個請求。執行這些請求需要一段時間。如果用戶在此隊列運行時離開視圖控制器,則操作系統將取消分配視圖控制器,並收到「發送到解除分配的實例的消息」錯誤。如何安全地取消ASINworkworkQueue中的所有請求查看釋放

我曾嘗試在dealloc方法使用

[self.queue cancelAllOperations]; 

,但看起來它只能取消正在等待在隊列中的請求,而不是請求正在運行,並且我得到了同樣的錯誤。

什麼是處理這種情況的正確方法是什麼?即使用戶離開隊列還沒有完成,是否有可能使視圖控制器不被釋放?或者有沒有辦法取消隊列中的所有請求(包括正在運行的請求)?

+0

我敢說你不應該有1500+請求排隊的移動設備,這似乎有點小題大做上。 – darvids0n 2012-01-19 00:03:43

回答

1

的由@ darvids0n @AlexReynolds建議,都是很好的。

這個問題可能是,對於當前請求的委託仍設置,因此,它設法通知(今解除分配)委託,它的被取消。

你可以最有可能通過將所有的代表到零,而不是避免這種情況:

for (ASIHTTPRequest *req in queue.operations) 
{ 
    [req setDelegate:nil]; 
    [req cancel]; 
} 
[queue setDelegate:nil]; 
0

從該視圖控制器拆下網絡隊列的壽命。例如,是否由應用程序委託來管理它,只要應用程序處於活動狀態,該應用程序委託就應該處於活動狀態。

當視圖控制器被駁回,取消在應用程序委託的網絡隊列中的所有操作。即使視圖控制器已經死機,應用程序代理也應該保持連續不斷,爲網絡隊列提供足夠的時間來完成清理工作。

如果你認爲你有多個隊列,保持一個數組或字典一些標識或索引它們的引用,這樣就可以保持跟蹤它們從各自的視圖控制器分離。