我知道我可以使用dataTaskWithURL:completionHandler:
来获取completionHandler块中的数据,但是阻止了委托方法的触发,我需要didReceiveData:
方法来触发,因为我是如何配置我的进度指标。
一旦完成,我完全不知道如何获取下载的数据。什么是委托方法相当于完成块? didCompleteWithError
似乎没有返回任何NSData
。
我不必在didReceiveData
手动分割数据,是吗?当完成处理程序只是把它交给你时,这似乎真的很蹩脚。我不介意这样做,如果不是因为我可以一次下载50多个东西,所以跟踪所有部分数据似乎是屁股的痛苦。我应该切换到NSURLSessionDownloadTask
吗?
答案 0 :(得分:6)
是的,您必须手动将数据分块(或者如果它非常大并且您不希望它占用内存,则可以将其流式传输到文件中。)
因此,didReceiveData
方法会在数据输入时返回。因此,您应该实例化NSMutableData
(例如,在didReceiveResponse
中)didReceiveData
将在数据输入时附加数据。调用didCompleteWithError
时,假设错误为nil
,您可以确信您的NSMutableData
现在包含收到的所有数据。正如您所指出的,挑战在于跟踪所有50多个下载,因此我维护一个由任务标识符键入的字典,以跟踪将数据附加到哪个字典。 (就个人而言,我认为NSURLSession
在会话级实现任务,下载和上传委托是一个设计缺陷,而不是让我们为每个任务实例化单独的任务委托对象。但我们坚持我们已经有了。)
如果您只是下载数据,NSURLSessionDownloadTask
是一个很好的选择(并且在内存使用方面比仅仅附加到NSMutableData
实例更有效),您可以想象也可以使用如果你想要一个后台会话(你不能使用NSURLSessionDataTask
)。
最后,如果您真的要进行50多次下载,您可能需要考虑将下载任务包装在NSOperation
子类中,这样您就可以限制并发运行的数量,而不会有任何超时的风险。