简体   繁体   English

urlSession:dataTask:didReceive:在Xcode8 Swift3中没有调用completionHandler

[英]urlSession:dataTask:didReceive:completionHandler not called in Xcode8 Swift3

I've created a background URLSession object using the following code: 我使用以下代码创建了一个后台URLSession对象:

let identifier = /* some background identifier */
let config = URLSessionConfiguration.background(withIdentifier: identifier)
self.session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

I've also implemented the following URLSessionDataDelegate methods in the delegate class: 我还在委托类中实现了以下URLSessionDataDelegate方法:

public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
    // code goes here
}

public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    // code goes here
}

public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { 
    // code goes here
}

I'm able to successfully call URLSessionUploadTask from this session using the following: 我可以使用以下URLSessionUploadTask从此会话成功调用URLSessionUploadTask

let fileURl = /* some file url */
let request = /* some URLRequest */
let task = session.uploadTask(with: request, fromFile: fileUrl)
task.resume()

But for some reason I only get callbacks for: 但由于某种原因,我只得到回调:

`urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)` 

and

`urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)`.

The delegate method: 委托方法:

`urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)`

never gets called. 永远不会被召唤。

Is this a bug in Xcode8 or am I missing something important? 这是Xcode8中的一个错误还是我错过了一些重要的东西? Thanks for the help! 谢谢您的帮助!

Direct quote from Apple SDK regarding this method: Apple SDK直接引用此方法:

/*
 * Messages related to the operation of a task that delivers data
 * directly to the delegate.
 */
@protocol NSURLSessionDataDelegate <NSURLSessionTaskDelegate>
@optional
/* The task has received a response and no further messages will be
 * received until the completion block is called. The disposition
 * allows you to cancel a request or to turn a data task into a
 * download task. This delegate message is optional - if you do not
 * implement it, you can get the response as a property of the task.
 *
 * This method will not be called for background upload tasks (which cannot be converted to download tasks).
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                 didReceiveResponse:(NSURLResponse *)response
                                  completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;

Edit: added more context to a quote 编辑:为报价添加更多上下文

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM