ios - NSURLSessionDownloadTask - 在 didFinishDownloading 之前读取下载的数据

标签 ios nsurlsession nsurlsessiondownloadtask

我正在尝试将 NSURLConnection 替换为 NSURLSession,但我发现使用 NSURLSession 我无法像我一样读取中间数据 block 使用委托(delegate)方法在 NSURLConnection 中执行。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

我曾经在完成之前就开始使用数据。我有点流媒体。我如何在 NSURLSession 完成之前访问下载的数据?

我注意到有一个 (NSURL *)location 是在完成之前从 NSURLSession 中临时保存的数据位置,但是我可以在完成之前获取这个 URL 吗?

谢谢


按照 Rob 的建议尝试了这个:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionTask *task = [session dataTaskWithRequest:request];
[task resume];

然而,只有 didRecieveResponse 被调用了

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler

但没有调用 didReceiveData。

我尝试将任务更改为下载任务

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDownloadTask * downloadTask =[defaultSession downloadTaskWithRequest:request];
[downloadTask resume];

它与下载委托(delegate)一起工作,但未调用数据委托(delegate) (didReceiveData)。

谁能告诉我我做错了什么?

最佳答案

如果您使用 NSURLSession 的基于委托(delegate)的再现,则 NSURLSessionDataDelegate 协议(protocol)包含一个 didReceiveData 方法,因此您可以实例化一个 NSURLSessionDataTask,然后像使用 NSURLConnection 一样编写您自己的流代码:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self];
NSURLSessionTask *task = [session dataTaskWithRequest:request];
[task resume];

或者,如果您不想编写自己的流代码,但希望 NSURLSession 为您将其流式传输到文件并让您了解其进度,再次使用 委托(delegate)基于NSURLSession的再现,创建并恢复一个NSURLSessionDownloadTask:

NSURLSessionTask *task = [session downloadTaskWithRequest:request];
[task resume];

完成后,您可以实现 NSURLSessionDownloadDelegate 协议(protocol)的 didWriteData 方法,它会在写入数据时通知您(显然,只要您的应用程序是在前台;如果您使用后台 session 并且应用程序未处于事件状态,则您的应用程序仅在所有后台任务完成后才会重新激活)。但那样你就可以两全其美,NSURLSession 进行流式下载,但会让你了解它的进度。

但是,如果您正在使用 NSURLSessionDownloadTask,则在下载完成之前您无权访问临时文件的 NSURL(并且在 didFinishDownloadingToURL 你会将这个临时文件移动到它的永久最终位置。

关于ios - NSURLSessionDownloadTask - 在 didFinishDownloading 之前读取下载的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25462113/

相关文章:

ios - swift : Data passed through unwind segue is erased before being read

ios - 为什么 HTTPS NSURLSession 连接每个域只被挑战一次?

Swift:无法在委托(delegate)中获取 URLSession 下载的进度?

ios - 具有无效简历数据的 NSURLSession

ios - NSURLSession backgroundSession 完成时额外的 API 调用

iphone - iOS 中的移动 jQuery - 如何在 UIWebView 中获取元素位置?

html - iOS 网络应用程序中的 Facebook/Google+/Twitter 共享功能

cocoa-touch - NSURLSession 取消任务

ios - 我怎样才能从 NSUrlSession 返回一个 NSHttpUrlResponse 状态码

ios - UIPopoverController 宽度未设置