Ich habe gerade über Async-Funktionen in einer Frage gelernt, die ich früher gepostet habe, und ich musste eine andere integrieren. Ich lese eine Liste von Einträgen aus Firebase, gebe eine Liste von ihnen zurück und ordne sie einem Array zu.Async-Funktion kehrt fein, aber Array wird leer
Jetzt ist das Problem, wenn ich das Array auf die aufrufende Funktion zurückgeben, ist das Array jetzt leer und ich bin mir nicht sicher warum.
Dies ist, wie ich die Firebase Einträge sammle (funktioniert):
func getListItems(uid: String, completion: (list: Array<String>?) -> Void) {
let ref = Firebase(url: getFirebaseURL() + "/" + uid)
var taskList = [String]()
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? FDataSnapshot {
taskList.append(rest.value as! String)
}
completion(list: taskList)
})
}
Und das ist, wie ich diese Funktion nenne und versuchen, es zu einem lokalen Array zuweisen, damit ich um diese Elemente hinzufügen ein Tableview:
// Retrieve database items
let uid = def.valueForKey("uid") as! String
getListItems(uid) {
(result) in
self.taskListItems = result!
//print(result) // This prints out an array filled with my data
}
print(taskListItems) // This prints an empty array
Wenn ich print(result)
tun spuckt es eine perfekte Anordnung, aber nicht, wenn ich drucken sie das lokale Array I zu verwenden, versuche. Ich habe definiert als: var taskListItems = [String]()
Ich habe auch versucht, mit .append
, die auch nicht funktioniert, so bin ich wirklich verloren, was los ist.
Sie haben eine Racebedingung. Der Code in der Schließung geschieht in einem separaten Thread. Wenn Sie das Array drucken, ist der Schließungscode noch nicht vollständig. – ryantxr
Dies wurde viele, viele Male auf Stack Overflow behandelt, also bitte suchen, bevor Sie fragen. Siehe zum Beispiel meine Antwort hier: http://stackoverflow.com/a/33699235/341994 – matt
@matt Ja, ich habe ** über ** asynchrone Funktionen gelernt, ich habe sie offensichtlich ** nicht gelernt **, was ist Warum frage ich hier – dsch