【发布时间】:2018-06-27 11:02:48
【问题描述】:
我尝试使用NSURLSessionDataTask 下载压缩存档。
我知道有一个NSURLSessionDownloadTask,但关键是我想要一个didReceiveData 回调(以显示进度)。
代码是:
NSURLRequest *request = [NSURLRequest requestWithURL:@"..."
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSOperationQueue *myQueue = [NSOperationQueue new];
myQueue.underlyingQueue = dispatch_get_main_queue();
NSURLSession *session = [NSURLSession sessionWithConfiguration:config
delegate:self
delegateQueue:myQueue];
NSURLSessionDataTask* task = [session dataTaskWithRequest:request
completionHandler:^( NSData *data, NSURLResponse *response, NSError *error){ ... }
[task resume];
我的班级符合NSURLSessionDataDelegate。
当我调用该方法时,几秒钟后,调试器会转到 completionHandler,出现 nil 数据和 nil 错误。
我做错了什么?
我也试过了:
- 在没有完成处理程序的情况下调用,然后调试器转到
didReceiveResponse回调并返回 200 响应,仅此而已。 - 将
[NSOperationQueue new]用于队列 - 使用
[NSURLSession sharedSession]- 没有得到任何响应 - 使用
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier: @"..."]- 说我不能使用completionHandler,但没有它 - 也没有响应。
【问题讨论】:
-
您有两个选择:1) 使用委托并实现必要的委托方法 2) 使用完成处理程序。这些选项不可混合使用。
didReceiveData属于代表。dataTaskWithRequest:completionHandler:属于完成处理程序 -
是的,但即使我使用其中之一,它也不会向我发送任何数据。
-
基本上200回调是好的。您是否实现了其他传递数据的委托方法?
-
是的,我实现了这个:
- (void)URLSession:(NSURLSession *) session dataTask:(NSURLSessionDataTask *) dataTask didReceiveData:(NSData *)data -
至少也实现
didFailWithError以获得可能的错误。
标签: ios objective-c nsurlsession nsurlsessiondatatask