美文网首页
URLSessionDataDelegate回调函数的执行问题

URLSessionDataDelegate回调函数的执行问题

作者: la0fu | 来源:发表于2016-11-17 17:40 被阅读333次

最近在项目开发中,想实现一个图片下载并展示进度百分比的功能。很自然的,用到了URLSessionDataTask,通过这个类下载图片,并通过回调方法来观察下载的进度。代码如下:

session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main)    

session?.dataTask(with: url) { (data, response, error) in
    print("receive reponse:\(response)")
}.resume()

//回调函数
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Swift.Void) {
    print("didReceive response")
}
    
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    print("didReceive data")
}

然而,发现这两个回调函数根本就没有被调用。发现导致这个原因的问题是上面的代码设置了completionHandler: { (<#Data?#>, <#URLResponse?#>, <#Error?#>)。只要设置了completionHandler,回调函数就不执行了。所以上面的代码要改为:

session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main)
                
session?.dataTask(with: url).resume()

然而,运行后发现只执行了public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition)public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)还是没有执行。网上搜索后发现需要在didReceive response回调里设置下面这一行,这样didReceive data方法才会被调用。

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
    completionHandler(URLSession.ResponseDisposition.allow) 
}

NSURLSessionResponseDisposition有三个属性,含义如下

NSURLSessionResponseCancel
Cancel the load. Equivalent to calling cancel on the task.
NSURLSessionResponseAllow
Allow the load operation to continue.
NSURLSessionResponseBecomeDownload
Convert this request into a download task.

然而,如果我们不实现didReceive response,那么didReceive data方法是会被调用的。

相关文章

  • URLSessionDataDelegate回调函数的执行问题

    最近在项目开发中,想实现一个图片下载并展示进度百分比的功能。很自然的,用到了URLSessionDataTask,...

  • 异步的发展

    回调函数存在两个问题1、不能try catch执行异步代码,结果放在回调函数里面回调函数再执行,这是两个不同的过程...

  • 前端入门11 -- JavaScript之Promise

    回调函数 回调函数分为两种类型,分别为同步回调与异步回调; 同步回调:会立即执行,完全执行完了才结束,不会放入回调...

  • JS回调函数理解

    定义 将函数A作为参数传入函数B,当函数B执行完成后,再执行传入的函数A,这个过程就是回调,函数A就是函数B的回调...

  • JS同步回调和异步回调

    同步回调函数 按照正常顺序执行 输出为: 异步回调函数 setTimeout将回调函数放在下一个任务队列执行 输出为

  • 从回调函数到 async await,理清异步编程解决方案

    异步解决方案历程 1. 回调函数 回调函数是最开始的异步解决方案,在异步代码执行完后去执行回调函数 这样做有几个缺...

  • JavaScript 回调函数

    什么是回调函数? 回调函数是一个函数,将会在另一个函数完成执行后立即执行。回调函数是一个作为参数传给另一个函数的函...

  • Promise(二)then的原理

    Promise.then 函数接受两个函数,第一个函数执行成功回调(onResolve),第二个函数执行错误回调(...

  • React基础篇之组件组件实例三大属性refs

    字符串形式的ref 回调函数形式的ref 回调ref中回调执行次数的问题 createRef的使用 上一篇:Rea...

  • 关于call和bind的区别

    不多说,直接上代码 回调函数中用call 更改函数的this指向,函数也会立即执行,返回值是函数的执行结果 回调函...

网友评论

      本文标题:URLSessionDataDelegate回调函数的执行问题

      本文链接:https://www.haomeiwen.com/subject/lladpttx.html