URLSession 实例方法`downloadTask` 错误

Posted

技术标签:

【中文标题】URLSession 实例方法`downloadTask` 错误【英文标题】:URLSession instance method `downloadTask` error 【发布时间】:2017-02-16 02:09:31 【问题描述】:

我已将 Advanced NSOperations 示例应用程序更新到 Swift 3。唯一剩余的构建错误是来自 DownloadEarthquakesOperation 类的代码的这个 sn-p。

    let url = URL(string: "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson")!

    let task = URLSession.shared.downloadTask(with: url)  (url, response, error) in
        self.downloadFinished(url, response: response, error: error)
    

错误显示:

不能使用类型为 '( 的参数列表: URL, (URL?, URLResponse?, Error?) -> Void)'

需要一个类型为'的参数列表(带有:URL,completionHandler: @escaping (URL?, URLResponse?, Error?) -> Void)'

这个错误对我来说没有任何意义,因为@escaping 属性不应该影响调用站点。 有什么想法吗?

【问题讨论】:

这看起来很奇怪。如果您尝试不使用尾随闭包语法会怎样? IE。添加completionHandler: 标签并将其移动到 ) @DaveWeston 试过了。还是没有运气。 【参考方案1】:

单行闭包通常会导致问题,因为编译器试图从闭包中的一行返回的任何内容推断闭包的返回类型。理论上它应该能够推断出正确的类型(因为downloadFinished 返回Void),但是在AdvancedNSOperations 的初始转换过程中似乎存在很多问题,以至于它只是变得混乱。您可以通过添加明确的 return 语句来消除该警告:

let url = URL(string: "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson")!

let task = URLSession.shared.downloadTask(with: url)  url, response, error in
    self.downloadFinished(url, response: response, error: error)
    return

坦率地说,一旦我完成了转换(修复了所有其他问题),我就可以返回并删除那个 return 语句,这不再是一个问题。

【讨论】:

【参考方案2】:

Swift 3 中尝试一下:

let url = URL(string: "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson")!

URLSession.shared.dataTask(with: url, completionHandler:  (data, response, error) in
    if error != nil 
        print(error!)
        return
    
    // dosomething here
    print(data)

).resume()

希望对您有所帮助!

【讨论】:

以上是关于URLSession 实例方法`downloadTask` 错误的主要内容,如果未能解决你的问题,请参考以下文章

工程日记之ChildLost:URLSession

未调用 URLSession 委托成功方法,但没有错误

测试后台 URLSession 的最佳方法是啥?

NSURLSessionTaskDelegate 方法 URLSession:task:didCompleteWithError: 从不调用

使用 URLSession 将数据获取到 PHP 方法 - swift

URLSession 下载任务委托仅在所有任务完成后调用