2017-01-07 2 views
1

Ich Abrufen von Daten aus meiner Datenbank und Verwenden einer Struktur, um das Objekt zu behandeln. Ich muss unten auf newObj zugreifen, aber das Bild ist nil. Wenn ich das Bild in der Konvertierung von Daten zu einem UIImage drucke, existiert das Bild, aber wenn ich es unter dem .getDataInBackground drucke, ist es Null. Ich vermute, dass ich es in den Block stecken oder es auf einem synchronen Thread laufen lassen muss? Was ist der richtige Weg, damit umzugehen?Wie kann ich nach dem Abrufen von Daten instanziieren?

var pic = UIImage() 
pic.getDataInBackground(block: { (data: Data?, error: Error?) in 
    if(error == nil){ 
     let newPic = UIImage(data: data!) 
     if(newPic != nil){ 
      pic = newPic! 
      print("inside block \(pic)") //returns data 
     } 
    }else{ 
     print(error) 
    } 
}) 
print(pic) // returns 0 

let newObj = Obj(name: "Bob", pic: pic) 

Antwort

1

Der getDataInBackground Verschluss auf dem Hintergrund-Thread ausgeführt wird, und wird einige Zeit, den Code direkt nach der Schließung vor die Schließung genannt nehmen ausgeführt wird, so pic eine Chance, noch initialisiert zu werden, nicht gehabt hat .

In Ihrem aktuellen Code, die Reihenfolge der Druck Aussagen sollte sein:

UIImage() // via `print(pic)` 
inside block UIImage() // via `print("inside block \(pic)")` 

Sie wollen wahrscheinlich Ihre newObj im Rahmen des Verschlusses wie diese erstellen:

pic.getDataInBackground(block: { (data: Data?, error: Error?) in 
    // #3 0.25s 
    if(error == nil){ 
     let newPic = UIImage(data: data!) 
     if(newPic != nil){ 
      pic = newPic! 
      print("inside block \(pic)") 

      let newObj = Obj(name: "Bob", pic: pic) 

      // pass the new object back to the main queue through 
      // a method 
      DispatchQueue.main.async { 
       collectObj(newObj) 
      } 

     } 
    } 
    else{ 
     print(error) 
    } 
}) 
Verwandte Themen