gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:29:22 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com