切换视图控制器时,我应该明确处理中断的异步进程吗?

时间:2013-06-21 01:56:41

标签: ios objective-c multithreading

我似乎无法很好地说出这个问题以获得丰硕的搜索结果。

如果我在等待网络连接完成时更改最前面的视图控制器,我应该围绕网络请求构建错误处理吗?或者我可以期望回调块发送消息nil并且什么都没发生?或者是否有一些预处理器魔术礼貌地停止了这个过程?

对于不在主线程上的所有进程,答案是否相同?

1 个答案:

答案 0 :(得分:3)

如果异步请求的委托是视图控制器并且该视图控制器变为非活动状态,则应取消该请求。

如果您不取消请求,则可能是在尝试执行与用户不再相关的操作。我们曾经遇到过这个问题,并且用户看到了与之无关的弹出警报。

如果您使用NSURLConnection,只需调用cancel方法即可。您通常必须为NSURLConnection对象保留一个强指针,以便您可以执行此操作。

取消请求的好地方是在prepareForSegue之前切换到另一个视图。

使用导航控制器(push segue)或模态segue,视图控制器保留在堆栈中,因此不会被释放。您的委托方法仍将被调用。即使在其他情况下,您也可能遇到竞争条件,因此请务必取消。

您还应该考虑在视图控制器的viewWilLDisappear方法中取消请求。如果用户在请求收到响应之前单击主页按钮,然后返回到应用程序,请求很可能会出错(超时)。如果您在连接错误时没有做任何事情,那么您很好,但如果您显示错误,用户一旦重新启动应用程序就不会发现错误。

假设MVC范例,答案对于与特定视图相关的所有进程几乎相同。

在某些情况下,异步请求的委托可能是单独类(不是视图控制器)的实例,而不是取消,您将始终处理响应,即使在同一个线程中(主运行循环) )。我在“在后台”更新内容时执行此操作。