UIImage 下载返回 nil 并导致应用程序崩溃 (Swift)

UIImage Download Returning nil and Crashing App (Swift)

我有一张图片 url 字符串:

var remoteImage: String = "http://server.com/wall-e.jpg"

然后我使用 Grand Central Dispatch 将 remoteImage 作为 NSURL 字符串参数构造一个 UIImage 以在 单独线程 上下载:

let getImage = UIImage(data: NSData(contentsOfURL: NSURL(string: remoteImage)!)!)

完成后,我 return 回到主线程,我将其保存在内部:

UIImageJPEGRepresentation(getImage, 1.0).writeToFile(imagePath, atomically: true)

在 Wi-fi 和 LTE 上它下载正常,但在测试边缘情况时,例如在边缘网络上(没有双关语意),我不一致得到错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

现在我认为通过添加以下内容确保它不是 nil 会很安全:

if getImage != nil { ... }

但这似乎并没有什么不同。它仍然得到错误并突出显示 let getImage 如上所述。我在这里做错了什么?我应该以不同的方式或方法检查 nil 吗?

我建议您使用 AsyncRequest 来获取和下载图像并将其保存在本地。 因为您没有发布任何问题代码。 所以我发布了一个为我工作的示例。

Sample for downloading and saving image locally

    var url = NSURL(string : "http://freedwallpaper.com/wp-content/uploads/2014/09/Tattoo-Girl.jpg")

    let urlrequest = NSURLRequest(URL: url!)
    NSURLConnection.sendAsynchronousRequest(urlrequest, queue: NSOperationQueue.mainQueue(), completionHandler: {
        response ,data , error in

        if error != nil
        {
            println("error occurs")
        }
        else
        {
            let image = UIImage(data: data)

            /* Storing image locally */

            var documentsDirectory:String?
            var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
            println(paths)
            if paths.count > 0{
                documentsDirectory = paths[0] as? String
                var savePath = documentsDirectory! + "/bach.jpg"
                NSFileManager.defaultManager().createFileAtPath(savePath, contents: data, attributes: nil)
                self.bach.image  = UIImage(named: savePath)
            }
        }

    })

}

错误,确实如此,其实就在于:

    let getImage = UIImage(data: NSData(contentsOfURL: NSURL(string: remoteImage)!)!)

原因是最初返回nil的不是UIImage,很有可能是NSData返回nil。您可以检查 NSData 是否返回 nil,然后创建 UIImage 对象。

编辑: 特定代码行所做的是假设 NSData 始终返回非零值,当您未连接时这可能不是真的.当你没有连接时,它会得到一个 nil 值,你试图用感叹号 (!) 说它永远不会是 nil 值。

我建议您进一步阅读 Swift 的工作原理。对于这个特定的例子,看看 Swift 中感叹号的实际含义:What does an exclamation mark mean in the Swift language?