在下载字节时从 NSURLSessionDownloadTask 访问字节

Posted

技术标签:

【中文标题】在下载字节时从 NSURLSessionDownloadTask 访问字节【英文标题】:Accessing the bytes from NSURLSessionDownloadTask as they are downloaded 【发布时间】:2015-04-28 02:40:59 【问题描述】:

在我的应用中,我目前使用NSURLSessionDownloadTask 通过 HTTP 获取文件。

这个类提供了一个有用的委托接口来监控它的进度并在下载完成后通过NSURLSessionDownloadDelegate获取字节,但是我无法找到任何方法来访问下载的字节(在下载完成之前) )。

是否可以访问这些字节,或者我是否需要使用其他机制下载文件?

【问题讨论】:

【参考方案1】:

如果您想在下载字节时访问它们,您应该使用数据任务,而不是下载任务。如果您随后实现NSURLSessionDataDelegate 方法(特别是didReceiveData),您可以在下载字节时访问它们。

【讨论】:

【参考方案2】:

您可以使用以下方法来访问正在接收的数据:

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data

【讨论】:

这是NSURLSessionDataDelegate需要的方法,不是NSURLSessionDownloadDelegate。 你是对的。有时这种长类/方法名称会导致误读。约翰的答案是正确的。【参考方案3】:

@C6Silver 的答案是 NSURLSessionDataDelegate 上的方法,而不是 NSURLSessionDownloadDelegate。这是您需要实现的方法:

- (void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
      totalBytesWritten:(int64_t)totalBytesWritten
      totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;

您可以使用totalBytesWritten 参数来访问您需要的数据。

编辑 - 我误解了这个问题。

您将不得不使用 NSURLSessionDataTask 而不是 DownloadTask,然后在 NSURLSessionDataDelegate 上使用委托方法:

- (void)URLSession:(NSURLSession *)session
      dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data;

这将允许您在收到数据时访问它。

【讨论】:

我认为这不是真的。来自苹果文档的 totalBytesWritten 是“到目前为止传输的总字节数”。我正在寻找写入临时文件的实际字节或指向该文件的指针。 totalBytesWritten is... 写入文件的总字节数,因为它将字节直接传输到文件或内存。结果是一样的。 没有。我想要字节的内容而不是接收到的字节数。 我现在明白了。在这种情况下,@C6Silver 是正确的。您将需要使用 NSURLSessionDataTask 来下载数据,然后使用他在他的答案中发布的方法来访问接收到的 NSData 对象(接收到的数据)。我已经更新了我的答案。

以上是关于在下载字节时从 NSURLSessionDownloadTask 访问字节的主要内容,如果未能解决你的问题,请参考以下文章

使用服务器端脚本时从数据表下载整个数据?

是否可以在 Windows 上运行时从可执行文件中定位函数?

保存对象时从错误线程访问的领域

在 UITableView 重新加载时从 SDWebImage 设置图像

仅在需要时从文件中进行 pip 安装

如何在运行时从 JVM 中提取类文件