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

Joh*_*ohn 7 ios nsurlsession nsurlsessiondownloadtask

我想,以取代NSURLConnectionNSURLSession,但我发现,NSURLSession我无法读取中间数据块像我一样在NSURLConnection与委托方法.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
Run Code Online (Sandbox Code Playgroud)

我曾经在完成之前开始使用数据.我有点流.如何在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];
Run Code Online (Sandbox Code Playgroud)

但是,只调用了didRecieveResponse

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
Run Code Online (Sandbox Code Playgroud)

但didReceiveData没有被调用.

我试图将任务更改为downloadTask

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDownloadTask * downloadTask =[defaultSession downloadTaskWithRequest:request];
[downloadTask resume];
Run Code Online (Sandbox Code Playgroud)

它适用于下载委托,但未调用数据委托(didReceiveData).

任何人都可以告诉我,我错了什么?

Rob*_*Rob 6

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

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self];
NSURLSessionTask *task = [session dataTaskWithRequest:request];
[task resume];
Run Code Online (Sandbox Code Playgroud)

另外,如果你不想写自己的流代码,但希望NSURLSession以流这一个文件给你,让你了解它的进步,再次使用delegate的基于再现NSURLSession,创造和resume一个NSURLSessionDownloadTask:

NSURLSessionTask *task = [session downloadTaskWithRequest:request];
[task resume];
Run Code Online (Sandbox Code Playgroud)

完成后,您可以实现协议的didWriteData方法,NSURLSessionDownloadDelegate它将在写入数据时通知您(显然,只要您的应用程序位于前台;如果您使用后台会话且应用程序未处于活动状态,则您的应用程序是只有当所有后台任务完成时才重新激活).但是,通过这种方式,您可以获得两全其美,NSURLSession流媒体下载的位置,但会让您了解其进度.

但是,如果您正在使用NSURLSessionDownloadTask,则NSURL在下载完成之前您无法访问临时文件(并且didFinishDownloadingToURL您将此临时文件移动到其永久的最终位置).

  • 再次感谢罗布。我只是在搜索同一主题,您写的所有内容都是正确的。不幸的是,dataTask 不能在后台运行(downloadTask 可以)......所以任何阅读本文的人都要注意这一点:) (2认同)