繁体   English   中英

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

[英]How do I get the data from a finished `NSURLSessionDataTask`?

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

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

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

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

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

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

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

暂无
暂无

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

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