我试图用NSURLConnection
替换NSURLSession
,但是我发现,使用NSURLSession
我无法像使用委托(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];
但是,只有receveResponse被调用了
- (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];
它与下载委托(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
格式,创建并resume
生成NSURLSessionDownloadTask
:NSURLSessionTask *task = [session downloadTaskWithRequest:request];
[task resume];
完成此操作后,您可以实现
didWriteData
协议(protocol)的NSURLSessionDownloadDelegate
方法,它会在写入数据时通知您(显然,只要您的应用程序位于前台;如果您使用后台 session 且该应用程序未处于 Activity 状态,则您的应用程序仅在所有后台任务完成后才重新激活)。但是这样一来,您就可以充分利用这两个方面的优势,NSURLSession
可以进行流下载,但可以让您随时了解其进度。但是,如果您使用的是
NSURLSessionDownloadTask
,则在下载完成之前您将无法访问该临时文件的NSURL
(在didFinishDownloadingToURL
中,您可以将该临时文件移至其永久的最终位置)。