iOS以任何方式取消所有网络请求

我正在做应用更新模块。 我想做的是:

如果有更新的版本检测,则提示用户同时更新AND,如果有则取消所有网络请求。 该请求可能由AFNETWORK创建,可能像[NSURLConnection sendSynchronousRequest:returningResponse:error:],所有类型的网络请求一样创建,只需将它们全部取消即可。 我可以吗?

使用+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error创建的连接+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error无法取消。 如果你从后台线程调用它,你可能能够杀死线程本身。

更好的方法是使用NSOperationQueue并从添加到队列的NSOperation对象启动网络连接。 (可选)您可以创建NSOperation的子类,并使每个实例都以其cancel方法作为目标来观察自定义事件通知。 使用此方法,您只需发布自定义通知即可触发对所有操作实例及其关联网络连接的取消。

如果您正在使用AFHTTPClient那么您可以保留其操作队列并取消其上的所有操作。

但是,除非您有一个已创建的所有NSURLConnection对象的列表,否则我不知道如何简单地取消所有NSURLConnection对象。

在评论中,OP表示他想要这样做的原因是因为他担心应用程序的其他部分会尝试访问不再可用的网络API。

如果是这种情况,最好的方法是为您的应用程序的其他部分提供一个API,您的部分,更新程序,可以调用说“中止所有内容!”。 这有几个好处:

  • 如果应用程序的其他部分开始使用BGNetworking(明年推出时将比AFNetworking好得多),您的更新程序代码仍然有效。
  • 它使应用程序的其他部分有机会进行他们可能想要的任何清理。 例如,他们可能只是放弃API调用而不是重试它,因为出了问题。

听起来这个更新程序组件不是可以独立于应用程序其余部分设计的组件。