1

我似乎对这个问题的措辞不够好,无法获得富有成效的搜索结果。

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

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

4

1 回答 1

3

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

如果您不取消请求,您可能会尝试做与用户不再相关的事情。我们曾经遇到过这个问题,用户看到不相关的弹出警报。

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

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

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

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

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

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

于 2013-06-21T02:34:27.030 回答