我有以下代码片段从网址加载图片:
let url = NSURL(string: imageUrl)
let data = NSData(contentsOfURL: url!)
let image = UIImage(data: data!)
如果我的变量imageUrl
具有有效的字符串值,那么保护此代码免受可能的边缘情况的最安全方法是什么?
以下代码似乎不是很方便:
if let url = NSURL(string: imageUrl) {
if let data = NSData(contentsOfURL: url) {
if let image = UIImage(data: data) {
// success -> do something with the image...
}
else {
// print error message
}
}
else {
// print error message
}
}
else {
// print error message
}
答案 0 :(得分:0)
最佳做法是不使用contentsOfURL
等同步方法从网络加载数据。
推荐的方式是NSURLSession
异步工作。
这是一个简单的例子,包含一个完成块和一个带有相关类型的枚举,
它捕获所有可能的错误
enum Result {
case Success(UIImage), Failure(NSString)
}
func loadImage(string : String, completion: (Result) -> ()) {
guard let url = NSURL(string: string) else {
completion(.Failure("Bad URL"))
return
}
NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
if error != nil {
completion(.Failure(error!.localizedDescription))
} else {
guard let image = UIImage(data: data!) else {
completion(.Failure("Could not load image data"))
return
}
completion(.Success(image))
}
}.resume()
}
用以下方式调用:
loadImage("http://myserver.com/path/to/image.png") { result in
switch result {
case .Success(let image) :
// do something with the image
case .Failure(let error) :
print(error)
}
}