我使用以下代码创建了一个背景URLSession对象:

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

我还在委托类中实现了以下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
}

我可以使用以下命令从此 session 中成功调用URLSessionUploadTask:
let fileURl = /* some file url */
let request = /* some URLRequest */
let task = session.uploadTask(with: request, fromFile: fileUrl)
task.resume()

但是由于某种原因,我只收到以下内容的回调:
`urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)`


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

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

永远不会被打电话。

这是Xcode8中的错误,还是我缺少重要的东西?
谢谢您的帮助!

最佳答案

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;

编辑:在报价中添加了更多上下文

关于ios - 在Xcode8 Swift3中未调用urlSession:dataTask:didReceive:completionHandler,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40378758/

10-10 21:05