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

标签 ios objective-c ios7 nsurlsession nsurlsessiondownloadtask

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

我完全不知道如何在完成后获取下载的数据。完成 block 的委托(delegate)方法是什么? didCompleteWithError 似乎没有返回任何 NSData

我不必在 didReceiveData 中手动拼凑数据,对吗?当 completionHandler 将它交给你时,这看起来真的很蹩脚。如果不是因为我可以一次下载 50 多个东西,我不会介意这样做,所以跟踪所有部分数据似乎很痛苦。我应该切换到 NSURLSessionDownloadTask 吗?

最佳答案

是的,您必须手动将数据拼凑在一起(或者如果它真的很大并且您不希望它占用内存,您可以将其流式传输到文件中)。

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

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

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

关于ios - 如何从完成的 `NSURLSessionDataTask` 获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21924483/

相关文章:

javascript - html 元素 safari iOS 的高度 100%

ios - 如何读取Azure应用服务中的请求正文?

ios - CGAffineTransformMakeTranslation 除了一个 subview

css - 修复了持久标题并滚动到聚焦的输入字段

ios - addSubview 与呈现模态 ViewController 之间的区别?

objective-c - 防止选择 MKPointAnnotation

objective-c - MPMediaItem 的 URL

ios - 在 iOS 中截取屏幕的特定部分

ios - UIWebView 错误 : -[UIWebView cut:]: unrecognized selector sent to instance

ios - TabBar 和 NavigationBar View 部分隐藏