从url安全加载图像的最佳实践

时间:2016-07-13 07:25:11

标签: error-handling swift2

我有以下代码片段从网址加载图片:

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
}

1 个答案:

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