【问题标题】:NSURLSessionDataTask fails on simple HTTPS URL with error -1002NSURLSessionDataTask 在简单的 HTTPS URL 上失败,错误为 -1002
【发布时间】:2015-07-19 22:43:35
【问题描述】:

我正在为 OS X 编写一个简单的 Twitter 应用程序,但我目前正忙于下载用户的个人资料图片。这是负责下载图片的代码:

let imageRequest: NSURLRequest = NSURLRequest(URL: NSURL(string: avatarURL)!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let dataTask = session.dataTaskWithRequest(imageRequest) {
    (data, response, error) in

    println(error)

    if data != nil {
        println("Got image")
        let image = NSImage(data: data!)
        completion(image)
    } else {
        println("Data is nil")
        completion(nil)
    }
}
dataTask!.resume()

avatarURL 是一个包含以下内容的字符串:https://pbs.twimg.com/profile_images/618168482086129664/C0E92y7G.png,这是我的 Twitter 头像的 URL。如您所见,它是一个完全有效的 URL,指向一个完全有效的图像。

但每当我运行我的应用程序时,println(error) 行会将其打印到我的控制台中:

Optional(Error Domain=NSURLErrorDomain Code=-1002 "操作无法完成。(NSURLErrorDomain error -1002.)" UserInfo=0x61000006ea80 {NSErrorFailingURLStringKey=Optional(https://pbs.twimg.com/profile_images/618168482086129664/C0E92y7G.png), NSUnderlyingError=0x600000243720 "操作无法完成'未完成。(kCFErrorDomainCFNetwork 错误 -1002.)", NSErrorFailingURLKey=Optional(https://pbs.twimg.com/profile_images/618168482086129664/C0E92y7G.png)})

我做错了吗?我已经用谷歌搜索了这个(什么字眼),我发现的几乎每个 SO 页面都有一个解决方案,基本上相当于“您的 URL 缺少 URL 方案/具有不受支持的 URL 方案”,这不是问题我有。

【问题讨论】:

  • 嗯,这段代码对我来说很好用(除了好奇地引用println,它不再在 Swift 2 中使用)。您可能需要仔细检查您的网址,确保没有任何空格或奇怪的不可见字符。
  • 很奇怪。我只是手动输入了 URL,以确保我没有复制任何不可见的字符,仍然没有。另外,println 是我编写的一个包装函数,它只是再次调用print,使其在NSWindow 子类中工作。
  • 实际上,从头开始。我刚刚清除了所有 Xcode 的缓存,现在它可以在手动将 URL 粘贴到代码中时工作。通常,我会从 Twitter 的 API 获取 URL,这就是它停止工作并产生上述错误的时候。什么
  • 原来字符串的“Optional()”部分是/实际上/字符串的一部分,而不仅仅是表明对象本身是可选的,因此我收到错误表示 URL 有问题。我以前从未见过这种情况。我认为这实际上是 Xcode 或 Swift 本身的一个错误。

标签: cocoa twitter nsurlsession swift2


【解决方案1】:

我终于想出了如何解决这个问题。以前,我只是懒惰地这样做:

var avatarURLString = String(responseObject["profile_image_url_https"])

这显然返回了一个不能用感叹号解开的 Optional。是的,我也不知道。就是这么回事。

现在,我这样做:

var avatarURLString = responseObject["profile_image_url_https"] as! String

...它实际上产生了一个正确的 String 对象,而不是一些奇怪的 not-quite-Optional。使用测试版编程语言万岁。

【讨论】:

  • 这并不是说它是一个“不完全可选”,而是它是一个非可选的,由开头的字符串Optional( 和结尾的) 组成。查看字符串长度,您会发现Optional() 实际上是字符串的一部分!这是因为它在可选上执行了字符串插值。如果您使用 String(responseObject["profile_image_url_https"]!) (解开下标函数返回的可选参数 before 将其传递给 String 构造函数,这将防止这种情况发生。或者只是做简单的演员,如你所展示在你上面的答案中。
  • 在 String 构造函数中解包对象什么也没做。
  • 好的。它对我有用,所以一定有其他事情发生。不过,您还有另一个解决方案,这很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多