UIImage下载返回nil和Crashing App(Swift)

时间:2015-05-29 21:42:32

标签: ios xcode swift uiimage

我有一个图片网址字符串:

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

然后我使用带有remoteImage的{​​{1}}作为NSURL字符串参数的Grand Central Dispatch在单独的线程上构建一个UIImage:

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

当它完成并返回主线程时,我将其保存在内部:

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

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

fatal error: unexpectedly found nil while unwrapping an Optional value

现在我认为通过添加来确保它不是nil我会安全的:

if getImage != nil { ... }

但它似乎并没有什么不同。它仍然会收到错误并突出显示上面写的let getImage。我在这做错了什么?我应该以不同的方式或方法检查零吗?

2 个答案:

答案 0 :(得分:2)

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

  

本地下载和保存图片的示例

    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)
            }
        }

    })

}

答案 1 :(得分:1)

这个错误确实存在于这一行:

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

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

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

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