这是一个悬而未决的问题,旨在了解我认为可能会遇到的问题的最佳做法或最常见的解决方案。
假设我有一个要下载的网址列表;列表本身托管在服务器上,因此我启动了一个NSURLConnection来下载它。 connectionDidFinishLoading中的代码将使用URL列表为每个URL异步实例化一个新的NSURLConnection;这反过来会触发更多的NSURLConnections,依此类推 - 直到没有更多的URL。将它视为连接树。
检测所有连接何时完成的最佳方式是什么?
我的目标是iOS7,但欢迎对其他版本发表评论。
答案 0 :(得分:4)
有几点想法:
在从服务器检索列表后触发后续下载方面,只需将逻辑放在第一个请求的完成处理程序块(或完成委托方法)中执行后续下载。
在下载大量文件方面,如果定位到iOS 7及更高版本,您可以考虑使用NSURLSession
代替NSURLConnection
。
首先,通过启动"下载"来下载具有适度内存占用的文件。任务(而不是"数据"任务)。
其次,您可以使用后台NSURLSessionConfiguration
进行下载,即使用户离开应用,也可以继续下载。请参阅适用于iOS的应用程序编程指南的Downloading Content in the Background部分。如果您这样做,有很多我需要点击和需要交叉,但考虑实施它是一个很好的功能。
有关NSURLSession
的介绍,请参阅WWDC 2013 What's New in Foundation Networking。或者查看URL Loading System Programming Guide。
就跟踪您是否已完成而言,正如Wain建议的那样,您可以跟踪已发出的请求数量以及完成/失败的请求数量,以及您的&#34任务完成"逻辑,只需比较这两个数字,然后启动"全部完成"如果完成次数与请求数匹配,则为逻辑。有很多方法可以做到这一点,在某种程度上取决于你的实现细节,但希望这说明了基本的想法。
答案 1 :(得分:2)
您应该考虑使用NSOperationQueue
而不是使用GCD。您还应将并发操作的数量(当然在移动设备上)限制为4,这样您就不会在请求时充斥网络。
现在,队列上的操作数是剩余计数。您可以在每个操作结束时添加一个块来检查队列计数并执行任何完成逻辑。