【问题标题】:URLSession dataTask how can I decipher the NSURLError?URLSession dataTask 如何破译 NSURLError?
【发布时间】:2017-12-01 14:09:09
【问题描述】:

考虑这段代码:

func load(url: URL?, callback: ((UIImage?) -> Void)? = nil) -> UIImage? {
    guard let url = url else {
      return nil
    }

    if let image = cache[url] {
        return image
    }
    guard let callback = callback else {
        return nil
    }
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    let config = URLSessionConfiguration.default
    config.timeoutIntervalForRequest = 10
    let session = URLSession(configuration: config, delegate: nil,         delegateQueue: OperationQueue.main)
    let task = session.dataTask(with: request) { data, response, error in
        guard let data = data else {
            return
        }
        DispatchQueue.global().async {
            let image = UIImage(data: data)
            DispatchQueue.main.async {
                self.cache[url] = image
                callback(image)
            }
        }
    }
    task.resume()
    return nil
}

我们遇到了一个问题,在session.dataTask 中,data 返回为 nil,错误是某种无法解读的 NSURLError。调试它并没有给我任何有用的线索,让我知道问题可能是什么。我们已经能够确定一些 URL 有效,而另一些则无效,但尚不清楚问题出在哪里。

有问题的网址是这样的:

http://website.com////assets//P//wa//_resampled//paddedimage400400-apicture.gif

这是我从复制错误中得到的,这再次强化了 url 有问题:

error   Error?  (instance_type = 0x0000608000246930 -> 0x0000000106a2ff48 (void *)0x0000000106a2ff20: NSURLError)   some

一个有效的网址是这个:

https://api.website.com/assets/P/wa/_resampled/picture.jpg

我的意思是显然这两个 URL 之间存在差异,但我可以向您保证,它们都可以在浏览器中工作并正确显示图像。

有人知道如何破译 NSURLError 或将其转换为某种可读格式吗?

如果没有,是否有人对 NSURL 可以使用的格式以及我们可能违反的格式制定了规范?

【问题讨论】:

  • Apple 框架抛出的任何NSError 实例都有domain、错误code 和本地化描述(localizedDescription)
  • 下载图片不需要写代码。这是很棒的图书馆github.com/rs/SDWebImage。使用它!
  • @vadian 谢谢这实际上很有用,可能会让我们到达某个地方。 The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
  • @vadian Jup,这就是修复它的原因。谢谢大佬。

标签: swift nsurlsession nsurl


【解决方案1】:

您可以检查error 是否不为零,然后将其转换为 NSError。

if let error = error {
    let nsError = error as NSError
    print(nsError.domain)
    print(nsError.code)
    print(nsError.localizedDescription)
    // ... check additional properties
}

【讨论】:

  • 也不错,但 localizedDescription 就够了
【解决方案2】:

我可以使用localizedDescription 来了解问题所在。然后这个The resource could not be loaded because the App Transport Security policy requires the use of a secure connection 修复了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多