我有ASINetworkQueue,其中包含超过1500个请求。执行此数量的请求需要一段时间。如果用户在此队列运行时离开视图控制器,操作系统将取消分配视图控制器,并且“将消息发送到解除分配的实例”错误。
我尝试过使用
[self.queue cancelAllOperations];
在dealloc方法中,但似乎它只取消了在队列中等待的请求,而不是当前正在运行的请求,我收到了同样的错误。
处理这种情况的正确方法是什么?是否可以在队列未完成时使视图控制器不被释放,即使用户离开它?或者有没有办法取消队列中的所有请求(包括正在运行的请求)?
答案 0 :(得分:1)
@ darvids0n和@AlexReynolds的建议都很好。
问题可能是当前请求的委托仍然设置,因此它尝试通知(现已解除分配)委托它已被取消。
您最有可能通过将所有委托设置为nil来避免这种情况:
for (ASIHTTPRequest *req in queue.operations)
{
[req setDelegate:nil];
[req cancel];
}
[queue setDelegate:nil];
答案 1 :(得分:0)
将网络队列的生命周期与视图控制器的生命周期分开。例如,让它由应用程序委托进行管理,只要应用程序处于活动状态,它就应该是活动的。
取消视图控制器后,取消app delegate的网络队列中的所有操作。即使视图控制器已经死了,应用程序委托也应该继续保持,为网络队列提供足够的时间来进行清理工作。
如果您认为您将拥有多个队列,请在具有某些标识符或索引的数组或字典中保留对它们的引用,以便您可以将它们与各自的视图控制器分开跟踪。