2016-07-24 10 views
-1

Ich habe ein Problem mit dem Firebase SDK für iOS in swift 2. Ich versuche, ein Bild zu einem Download aus dem Firebase-Speicher zu setzen. Wenn ich die Funktion anrufe, gibt es null zurück. Ich denke es ist, weil die Download-Aufgabe von der Firebase SDK asynchron ist, wenn also der zurückgegebene Zustand aufgerufen wird, wird die UID, die notwendig ist, nicht gesetzt, weil die Task nicht beendet ist. Wie kann ich das lösen, damit ich das richtige Bild zurückbekomme?Swift Firebase-Rückgabe in asynchron Aufgabe

override func viewDidLoad() { 
    super.viewDidLoad() 
    imageView.image = downloadProfilePicFirebase() 
} 

Die Firebase Download-Funktion:

func downloadProfilePicFirebase() -> UIImage{ 

    print("download called") 

    //local paths 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentDirectorPath:String = paths[0] 
    let imagesDirectoryPath = documentDirectorPath.stringByAppendingString("/profiles") 

    var uid = String() 


    if let user = FIRAuth.auth()?.currentUser { 
     let uid = user.uid 

     let storageRef = FIRStorage.storage().referenceForURL("gs://myid.appspot.com") 
     let profilePicRef = storageRef.child("/profile_pic.jpg") 

     let homeDir: NSURL = NSURL.fileURLWithPath(NSHomeDirectory()) 
     let fileURL: NSURL = homeDir.URLByAppendingPathComponent("Documents").URLByAppendingPathComponent("profiles").URLByAppendingPathComponent("profile_pic").URLByAppendingPathExtension("jpg") 

     // Download to the local filesystem 
     let downloadTask = profilePicRef.writeToFile(fileURL) { (URL, error) -> Void in 
      if (error != nil) { 
       print(error) 
      } else { 
       // svaed localy now put in ImageView 
      } 
     } 
    } 
    return UIImage(contentsOfFile: "\(imagesDirectoryPath)"+"/profile_pic_user_"+uid+".jpg")! 
} 
+0

Siehe [Antwort] (http://stackoverflow.com/a/38439609/5654848). – Dershowitz123

+0

@ Dershowitz123 ja aber der Rückkehrzustand gemeint wird vor der Fertigstellung aufgerufen werden Ich möchte die Funktion an diesem Punkt halten –

+0

Siehe auch diese Frage, und die Antwort, die ich verweise auf: http://StackOverflow.com/Questions/38547875/How -to-run-obverveeventtype-im-Haupt-Thread –

Antwort

3

Firebase ist asynchron, wie Sie so genannte lassen Sie es den Datenfluss innerhalb Ihrer App fahren.

Versuchen Sie nicht, Daten aus einem Firebase-Block zurückzugeben - lassen Sie den Block die zurückgegebenen Daten verarbeiten und gehen Sie dann zum nächsten Schritt über, sobald die Daten innerhalb des Blocks gültig sind.

Es gibt ein paar Optionen:

Eine Möglichkeit ist, Ihre Daten aus dem .writeToFile Abschluss Handler

override func viewDidLoad() { 
    super.viewDidLoad() 
    downloadPic() 
} 

func downloadPic { 
    let download = profilePicRef.writeToFile(localURL) { (URL, error) -> Void in 
     if (error != nil) { 
     // handle an error 
     } else { 
     imageView.image = UIImage(... 
     //then update your tableview, start a segue, or whatever the next step is 
     } 
    } 
} 

Eine zweite Option zu füllen ist, einen Beobachter an den Knoten hinzufügen und wenn das abgeschlossen ist, bevölkern Ihr imageView

override func viewDidLoad() { 
    super.viewDidLoad() 

    let download = storageRef.child('your_url').writeToFile(localFile) 

    let observer = download.observeStatus(.Success) { (snapshot) -> Void in 
    imageView.image = UIImage(... 
    //then update your tableview, start a segue, or whatever the next step is 
    } 
}