我有一个图片网址字符串:
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
。我在这做错了什么?我应该以不同的方式或方法检查零吗?
答案 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?