【问题标题】:How safely cancel all requests in ASINetworkQueue on view deallocate如何在视图解除分配时安全地取消 ASINetworkQueue 中的所有请求
【发布时间】:2012-01-20 00:03:21
【问题描述】:

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

我试过用

[self.queue cancelAllOperations];

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

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

【问题讨论】:

  • 我敢说你不应该在移动设备上排队超过 1500 个请求,这似乎有点矫枉过正。

标签: iphone ios asihttprequest


【解决方案1】:

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

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

您可以通过将所有代表设置为 nil 来避免这种情况:

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

【讨论】:

    【解决方案2】:

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

    当视图控制器被关闭时,取消应用委托的网络队列中的所有操作。即使视图控制器已死,应用程序委托也应继续运行,为网络队列提供足够的时间来完成其清理工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多