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



我试图用NSURLSession代替NSURLConnection,但我发现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];

但是,只调用了didrecieverresponse

- (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)没有被调用。

谁能告诉我我哪里做错了?

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

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self];
NSURLSessionTask *task = [session dataTaskWithRequest:request];
[task resume];
或者,如果您不想编写自己的流代码,但希望NSURLSession为您将其流式传输到文件并让您了解其进度,再次使用NSURLSession的基于delegate的版本,创建和resume一个NSURLSessionDownloadTask:
NSURLSessionTask *task = [session downloadTaskWithRequest:request];
[task resume];

这样做了,你就可以实现NSURLSessionDownloadDelegate协议的didWriteData方法,它会在数据写入时通知你(显然,只要你的应用程序在前台;如果你使用后台会话,而应用程序不是活动的,你的应用程序只有在所有后台任务完成后才会重新激活)。但这样你就可以两全其美,NSURLSession会进行流媒体下载,但会让你随时了解其进度。

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

最新更新