我知道我可以使用dataTaskWithURL:completionHandler:
获取completionHandler 块中的数据,但这会阻止委托方法触发,我需要didReceiveData:
触发方法,因为这是我配置进度指示器的方式。
我完全不知道如何在下载完成后获取数据。相当于完成块的委托方法是什么?didCompleteWithError
似乎没有返回任何NSData
.
我不必手动将数据拼凑在一起didReceiveData
,我呢?当completionHandler 把它交给你时,这看起来真的很蹩脚。如果不是因为我可以同时下载 50 多个东西,我不介意这样做,所以跟踪所有部分数据似乎很痛苦。我应该切换到NSURLSessionDownloadTask
?
是的,您必须手动将数据拼凑在一起(或者,如果数据真的很大并且您不希望它占用内存,则可以将其流式传输到文件中)。
So, didReceiveData
方法将返回您的数据。所以您应该实例化一个NSMutableData
(例如,在didReceiveResponse
) 到哪个didReceiveData
将在数据进来时追加数据。didCompleteWithError
被调用,假设错误是nil
,您可以确信您的NSMutableData
现在包含收到的所有数据。正如您所指出的,挑战在于跟踪所有 50 多个下载,因此我维护一个以任务标识符为键的字典,以跟踪将数据附加到哪个目录。 (我个人认为这是一个设计缺陷NSURLSession
在会话级别实现任务、下载和上传委托,而不是让我们为每个任务实例化单独的任务委托对象。但我们还是坚持现有的东西。)
如果您只是下载数据,NSURLSessionDownloadTask
是一个很好的选择(并且在内存使用方面比仅仅附加到更有效NSMutableData
实例),并且如果您愿意,您也可以使用后台会话(您不能使用NSURLSessionDataTask
).
最后,如果您确实进行了 50 多次下载,您可能需要考虑将下载任务包装在NSOperation
子类,以便您可以限制并发运行的数量,而不会冒任何超时的风险。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)