我知道我可以使用 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/