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?
我有一张图片 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?