如何在视图deallocate上安全地取消ASINetworkQueue中的所有请求

时间:2012-01-18 22:17:52

标签: iphone ios asihttprequest

我有ASINetworkQueue,其中包含超过1500个请求。执行此数量的请求需要一段时间。如果用户在此队列运行时离开视图控制器,操作系统将取消分配视图控制器,并且“将消息发送到解除分配的实例”错误。

我尝试过使用

[self.queue cancelAllOperations];

在dealloc方法中,但似乎它只取消了在队列中等待的请求,而不是当前正在运行的请求,我收到了同样的错误。

处理这种情况的正确方法是什么?是否可以在队列未完成时使视图控制器不被释放,即使用户离开它?或者有没有办法取消队列中的所有请求(包括正在运行的请求)?

2 个答案:

答案 0 :(得分:1)

@ darvids0n和@AlexReynolds的建议都很好。

问题可能是当前请求的委托仍然设置,因此它尝试通知(现已解除分配)委托它已被取消。

您最有可能通过将所有委托设置为nil来避免这种情况:

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

答案 1 :(得分:0)

将网络队列的生命周期与视图控制器的生命周期分开。例如,让它由应用程序委托进行管理,只要应用程序处于活动状态,它就应该是活动的。

取消视图控制器后,取消app delegate的网络队列中的所有操作。即使视图控制器已经死了,应用程序委托也应该继续保持,为网络队列提供足够的时间来进行清理工作。

如果您认为您将拥有多个队列,请在具有某些标识符或索引的数组或字典中保留对它们的引用,以便您可以将它们与各自的视图控制器分开跟踪。