Ich schreibe eine Funktion, die eine groupchatID (String) übernimmt und eine Liste von Recipients ([String]) für diesen Gruppenchat zurückgibt. Ich kämpfe jedoch mit dem asynchronen Teil der Funktion. Wenn ich die Funktion ausführe, druckt sie korrekt das Array der Benutzernamen, nach denen ich gesucht habe. Wenn ich jedoch die Funktion aufruft und versuche, den zurückgegebenen Wert zu drucken, ist es immer ein leeres Array, weil die Funktion das Array zurückgibt, bevor der Firebase-Aufruf beendet wurde. Ich versuche, einen Rückruf zu verwenden, aber ich verstehe die Syntax von allem nicht ganz. Bitte werfen Sie einen Blick und lassen Sie mich wissen, was geändert werden muss.Swift Funktion, die einen Wert vom asynchronen Firebase-Aufruf zurückgibt
Die Funktion:
func GetRecipientsFor(GroupChatID :String , completion: @escaping ([String]) ->()) {
var returnArray: [String] = [""]
rootRef.child("chatMembers").child(GroupChatID).observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children.allObjects {
var append = child as! FIRDataSnapshot
returnArray.append((append.key as String))
print("Return Array Currently Contains: \(returnArray)")
//The above printout works properly and when the for loop finishes, the array is exactly as I want it
}
completion(returnArray)
//BUT, this portion returns an empty array
})
}
Wie ich die Funktion aufrufen:
GetRecipientsFor(GroupChatID: gchatID) { (result) ->() in
print(result)
}
NEW Function Call
var recipients : [String] = [""]
DispatchQueue.main.async {
GetRecipientsFor(GroupChatID: gchatID) { result in
print(result) //PRINTS CORRECTLY!!!
recipients = result
}
}
print(recipients) //PRINTS A BLANK ARRAY
'GetRecipientsFor (GroupChatID: gchatID) {(Ergebnis) ->() in' zu' GetRecipientsFor (GroupChatID: gchatID) {führen in' funktionieren könnte? Wenn Sie das Array die Zeile nach 'completion (returnArray) 'drucken, wird es korrekt gedruckt? –
Ja, fügen Sie einen Druck vor/nach 'completion (returnArray)' hinzu. Es gibt einige andere fehlende Details. Dies sollte so funktionieren wie es ist. –
Haben Sie versucht, 'var returnArray: [String] = [" "] innerhalb des Verschlusses zu setzen? – skwashua