13

这是场景:

- 将 UIViewController (A) 推送到导航堆栈
- 在 vi​​ewDidLoad 上,使用 AFNetworking(在整个应用程序中共享的单例 AFHTTPClient)调用异步 GET 以填充视图上的各种用户元素(例如 UILabel)。
- 用户在请求返回之前按下后退按钮 -
假设其他活动视图控制器可能正在发出请求,因此您无法取消所有打开的操作

所以问题 #1 是,您应该跟踪 UIViewController A 发出的打开请求并在用户离开该视图时取消未完成的请求,还是应该让它们完成并忽略它们?由于 AFNetworking 使用块,正在更新的用户元素保留在块内,因此在弹出视图后执行成功/失败块时不会导致崩溃。然而,忽略它们的缺点似乎是不必要的网络流量。

问题 #2 是,您将在哪里执行代码以取消 UIViewController A 所做的操作?viewDidDisappear 似乎不正确,因为用户可能已经前进(将新视图推送到堆栈上)而不是后退(弹出当前视图),在这种情况下,您不想取消打开请求,因为用户可能会来返回当前视图,它不会再次加载。但是,我认为在请求执行时不会调用 dealloc 或 viewDidUnload,因为该块将保留用户元素,所以我认为它不能去那里。

不胜感激对此的想法。您认为最佳实践是什么?

4

2 回答 2

8

一般来说,当用户离开视图控制器时,您并不需要取消请求。在内存管理方面,对块 self 的引用将防止因向已释放的实例发送消息而导致的任何崩溃,所以不用担心。

至于用户体验,我想说你不应该真正担心它,直到它成为一个问题(我们开发人员有一个诀窍,可以完全错误地猜测我们的应用程序中什么会变慢)。但是,如果您正在发出大型 GET 请求,并且它会造成明显的迟缓,我的建议是让控制器执行HTTPClient -cancelAllHTTPOperationsWithMethod:path:-viewDidUnload:任何其他回调都为时过早)。

于 2012-04-17T22:12:37.843 回答
0

也许您可以有一个管理所有网络内容的单例,只需将其委托设置为当前 vc(在 viewDidLoad 中),这样您就可以获取任何传入数据,并在 vc 消失时向其发送取消消息(或者让不同的 vc成为它的代表)。或者单例可以保留数据以供任何 vc 在以后的某个阶段访问。出于这个原因,我倾向于不将异步代码放入我的 VC 中。

于 2012-04-11T18:40:01.100 回答