2016-03-27 2 views
1

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.

+0

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

+0

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

+0

@matt Ja, ich habe ** über ** asynchrone Funktionen gelernt, ich habe sie offensichtlich ** nicht gelernt **, was ist Warum frage ich hier – dsch

Antwort

1

Der Grund ist, dass die Zeile, wo Sie print(taskListItems) tun, vor print(result) in Ihrem Block aufgerufen wird. Dies liegt daran, dass die HTTP-Anfrage asynchron ist und den Code innerhalb des Blocks ausführt, nachdem er beendet wurde (was nach dem Aufruf von print(taskListItems) erfolgt). Was Sie tun sollten, ist Ihren Code, wo Sie die Ergebnisse innerhalb des Blocks verwenden.

+0

Danke! Ich benutze eine Tabellenansicht, um alle Einträge anzuzeigen, so dass ich denke, dass ich es von mehreren Orten aus zugänglich machen muss. Was ich getan habe, war nur meine Tabellenansicht zu aktualisieren und erschien dann. – dsch

Verwandte Themen