2016-07-24 25 views
3

Ich versuche, ein Bild von einer URL aus einer Backendless-Datenbank & konvertieren Sie diese in ein Bild, und geben Sie die Funktion mit einem UIImageView zurück. Wie gehe ich mit einem NSError in diesem Code um und gebe trotzdem das UIImageView zurück?Umgang mit NSData und Rückgabe UIImage (Swift)

func getImage() -> UIView { 

    let imageLink = backendless.userService.currentUser.getProperty("Avatar") 

    let URL = NSURL(string: imageLink as! String) 

    let data = NSData(contentsOfURL: URL!) 

    let image: UIImage! 

    image = UIImage(data: data!) 

    return UIImageView(image: image!) 
} 
+0

Wenn entweder der backendless Anruf oder die NSData (contentsOfURL) Aufruf zum Internet geht, dann sollten sie nicht synchron sein. Sie sollten Ihre Methode schreiben, um eine Abschlussschließung mit dem Bild als Parameter vorzunehmen. –

Antwort

4

Meine Antwort basierend auf den Kommentaren aktualisiert.

Sie können einen Platzhalter Bild zurück, wenn die, die Sie suchen nicht verfügbar:

So Ihre Methode wie folgt aussehen:

func getImage() -> UIImage { 

    var imageLink = backendless.userService.currentUser.getProperty("Avatar") 

    guard let imageUrl = imageLink as? String, 
     let URL = NSURL(string: imageUrl), 
     let data = NSData(contentsOfURL: URL) 
     else { 
      return UIImage(named: "placeholder") 
    } 

    return UIImage(data: data) 
} 

Hier ist, wie Sie es verwenden:

func koloda(koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView { 
    return UIImageView(image: getImage()) 
} 
+0

Die Methode, die imageView verwendet, lautet wie folgt: 'func koloda (koloda: KolodaView, viewForCardAtIndex index: UInt) -> UIView {]' es muss ein UIImageView zurückgegeben werden, wie würde ich das in diesem Fall implementieren? – Brandon

+0

Was sollte ein Verhalten in der App sein? Soll ein Platzhalter angezeigt werden, wenn ein Bild nicht verfügbar ist oder was? – fiks

+0

Idealerweise ein Platzhalter ja. – Brandon

1

Sie können Bild von einer URL herunterladen und als UIImage mit diesem Code zurückkehren. Hoffe, das hilft:

func downloadImage(url: NSURL) -> UIImage { 

     getDataFromUrl(url) { (data, response, error) in 
      dispatch_async(dispatch_get_main_queue()) {() -> Void in 
       guard let data = data where error == nil else { return } 

       let image:UIImage = UIImage(data: data)! 

       return image 
      } 
     } 
    } 

Update: dies die Funktion getDataFromUrl ist

func getDataFromUrl(url:NSURL, completion: ((data: NSData?, response: NSURLResponse?, error: NSError?) -> Void)) { 
     NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in 
      completion(data: data, response: response, error: error) 
      }.resume() 
    } 
+0

Wo ist die getDataFromUrl definiert? – Brandon

+0

Sorry, ich habe es vergessen. Bitte überprüfen Sie das Update. – firats