2016-07-13 9 views
0

Ich habe den folgenden Code-Snippet ein Bild von einer URL zu laden:Best Practice laden sicher Bild von url

let url = NSURL(string: imageUrl) 
let data = NSData(contentsOfURL: url!) 
let image = UIImage(data: data!) 

Im Fall, dass mein Variable imageUrl einen gültigen String-Wert hat, was ist der sicherste Weg, um diesen Code vor möglichen Randfällen zu schützen?

Code Nach scheint nicht sehr praktisch sein:

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 
} 

Antwort

0

Die beste Praxis ist keine synchrone Methode wie contentsOfURL zu verwenden, um Daten zu laden, aus über das Netzwerk.

Der empfohlene Weg ist NSURLSession, der asynchron arbeitet.

Dies ist ein einfaches Beispiel mit einem Block Abschluss und eine Enumeration mit den dazugehörigen Typen,
es alle möglichen Fehler fängt

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() 
} 

Nennen Sie es mit:

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

Sie haben Recht mit der Tatsache von asynchronen Anfragen. Aber in der Tat beantwortet dein Beitrag meine genaue Frage nicht ... –