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

时间:2014-08-23 12:52:04

标签: ios nsurlsession nsurlsessiondownloadtask

我正在尝试将NSURLConnection替换为NSURLSession,但我发现使用NSURLSession我无法像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。

我尝试将任务更改为downloadTask

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

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

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

1 个答案:

答案 0 :(得分:6)

如果您使用NSURLSession的基于委托的再现,NSURLSessionDataDelegate协议包含didReceiveData方法,那么您可以实例化NSURLSessionDataTask,然后编写自己的流媒体代码就像你使用NSURLConnection

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

或者,如果您不想编写自己的流媒体代码,但希望NSURLSession将此流式传输到文件并让您了解其进度,请再次使用{{1基于delegate的再现,创建和NSURLSession resume

NSURLSessionDownloadTask

完成后,您可以实现NSURLSessionTask *task = [session downloadTaskWithRequest:request]; [task resume]; 协议的didWriteData方法,它会在写入数据时通知您(显然,只要您的应用位于前台;如果您使用后台会话且应用程序未处于活动状态,只有在完成所有后台任务后才会重新激活您的应用程序。但是,通过这种方式,您可以获得两个世界中最好的,NSURLSessionDownloadDelegate进行流式下载,但会让您了解其进度。

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