如何从完成的`NSURLSessionDataTask`中获取数据?

时间:2014-02-21 03:04:17

标签: ios objective-c ios7 nsurlsession nsurlsessiondownloadtask

我知道我可以使用dataTaskWithURL:completionHandler:来获取completionHandler块中的数据,但是阻止了委托方法的触发,我需要didReceiveData:方法来触发,因为我是如何配置我的进度指标。

一旦完成,我完全不知道如何获取下载的数据。什么是委托方法相当于完成块? didCompleteWithError似乎没有返回任何NSData

我不必在didReceiveData手动分割数据,是吗?当完成处理程序只是把它交给你时,这似乎真的很蹩脚。我不介意这样做,如果不是因为我可以一次下载50多个东西,所以跟踪所有部分数据似乎是屁股的痛苦。我应该切换到NSURLSessionDownloadTask吗?

1 个答案:

答案 0 :(得分:6)

是的,您必须手动将数据分块(或者如果它非常大并且您不希望它占用内存,则可以将其流式传输到文件中。)

因此,didReceiveData方法会在数据输入时返回。因此,您应该实例化NSMutableData(例如,在didReceiveResponse中)didReceiveData将在数据输入时附加数据。调用didCompleteWithError时,假设错误为nil,您可以确信您的NSMutableData现在包含收到的所有数据。正如您所指出的,挑战在于跟踪所有50多个下载,因此我维护一个由任务标识符键入的字典,以跟踪将数据附加到哪个字典。 (就个人而言,我认为NSURLSession在会话级实现任务,下载和上传委托是一个设计缺陷,而不是让我们为每个任务实例化单独的任务委托对象。但我们坚持我们已经有了。)

如果您只是下载数据,NSURLSessionDownloadTask是一个很好的选择(并且在内存使用方面比仅仅附加到NSMutableData实例更有效),您可以想象也可以使用如果你想要一个后台会话(你不能使用NSURLSessionDataTask)。

最后,如果您真的要进行50多次下载,您可能需要考虑将下载任务包装在NSOperation子类中,这样您就可以限制并发运行的数量,而不会有任何超时的风险。

相关问题