【问题标题】:NSURLSession doesn't return dataNSURLSession 不返回数据
【发布时间】: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


【解决方案1】:

所以我找到了答案,但从文档中看不太明显: 我有几个回调,其中有didReceiveResponse

原来我必须调用完成处理程序才能使未来的回调工作,即: completionHandler(NSURLSessionResponseAllow);

还有一件事:didCompleteWithError 实际上也是告诉成功完成的委托,尽管名称暗示这是错误处理程序。 含义:下载成功后,调用该函数,error = nil

希望有一天这对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多