8

我试图用 替换NSURLConnectionNSURLSession但我发现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)。

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

4

1 回答 1

8

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

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

或者,如果您不想编写自己的流式处理代码,但想NSURLSession为您将其流式传输到文件并让您随时了解其进度,请再次使用基于、 create 和adelegate的再现:NSURLSessionresumeNSURLSessionDownloadTask

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

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

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

于 2014-08-23T13:20:51.517 回答