繁体   English   中英

异步NSURLConnection触发其他异步NSURLConnection:做到这一点的最佳方法是什么?

[英]Async NSURLConnection triggering other Async NSURLConnection: what is the best way of doing this?

这是一个开放性问题,旨在了解什么是我认为可能很常见的最佳实践或最常见的解决方案。

假设我有要下载的网址列表; 该列表本身托管在服务器上,因此我启动了一个NSURLConnection进行下载。 connectionDidFinishLoading中的代码将使用URL列表针对每个URL异步实例化一个新的NSURLConnection。 这反过来会触发更多的NSURLConnections,依此类推-直到没有更多的URL。 将其视为连接树。

检测所有连接何时完成的最佳方法是什么?

我针对的问题是iOS7,但欢迎对其他版本发表评论。

一些想法:

  1. 从服务器检索列表之后触发后续下载,只需将执行后续下载的逻辑放在第一个请求的完成处理程序块(或完成委托方法)中。

  2. 在下载大量文件方面,如果定位到iOS 7及更高版本,则可以考虑使用NSURLSession而不是NSURLConnection

    • 首先,通过启动“下载”任务(而不是“数据”任务)来启用具有适度的内存占用空间的文件下载。

    • 其次,您可以使用后台NSURLSessionConfiguration进行下载,即使用户离开了该应用程序,该下载也将继续进行。 请参阅iOS版应用程序编程指南》 的“背景”部分中的“ 下载内容 ”。 如果执行此操作,则有很多i需要点运算,而t需要交叉运算,但是考虑实现这是一个很棒的功能。

    有关NSURLSession的介绍,请参见WWDC 2013 Foundation Networking的新增 NSURLSession 或参见《 URL加载系统编程指南》中的relevent一章。

  3. 正如Wain所建议的那样,在跟踪您是否已完成方面,您可以跟踪已发出的请求数和已完成/失败的请求数,并且在“任务完成”逻辑中,只需将这两个数字进行比较即可,如果完成次数与请求次数匹配,则启动“所有完成”逻辑。 有很多方法可以执行此操作,在某种程度上取决于实现的细节,但是希望这可以说明基本思想。

而不是使用GCD,您应该考虑使用NSOperationQueue 您还应该将并发操作的数量(当然是在移动设备上)限制为4个,这样就不会使请求泛滥。

现在,队列上的操作数就是剩余的计数。 您可以在每个操作的末尾添加一个块,以检查队列计数并执行任何完成逻辑。

正如Rob在回答中所说的那样,您可能要考虑NSURLSession而不是自己做。 它具有许多优点。

其他选项包括建立自己的下载管理器类,或使用现成的第三方框架(如AFNetworking)。 我只使用了AFNetworking,但从它的优雅,强大和易于使用的角度来看。

我们公司为一个早于AFNetworking和NSURLSession的项目编写了一个基于NSURLConnection的异步下载管理器类。 这并不难,但是不如NSURLSession或AFNetworking灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM