2016-07-13 110 views
0

加載圖像,我有以下的代碼片段從一個URL加載圖像:最佳實踐安全地從URL

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

最好的做法是不使用同步方法類似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) 
    } 
} 
+0

You're右與異步請求的事實。但事實上你的發帖並不能回答我確切的問題...... –