Ich habe ein Problem, das meiner Meinung nach kein Problem sein sollte.Swift setzt keinen Wert in Return-Anweisung
Wenn ich diese "einfache" Funktion lade, sollte es die Benutzer innerhalb der DB zurückgeben.
- returns usersDictionary: All the users in a dictionary
*/
func getAllUsers() -> Dictionary<String, AnyObject> {
var usersDict = Dictionary<String, AnyObject>()
if userIsLoggedIn() == true{
FIRDatabase.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
if let userDictionary = snapshot.value as? [String:AnyObject]{
for user in userDictionary{
usersDict.updateValue(user.value as AnyObject
, forKey: user.key as String)
}
print("TEST")
print(usersDict)
}
print("TEST2")
print(usersDict)
})
print("TEST3")
print(usersDict)
return usersDict
}
return usersDict
}
Allerdings ist es nicht mit dem Wert zurückgeben usersDict, aber nur leer, was, weil es den Wert des TEST ausdruckt und TEST2 usersDict seltsam.
Aber Test3 bleibt leer, wie ist das möglich? Wenn ich in der Konsole nachschaue, macht es zuerst Test3 und dann test und dann test2. Diese
ist, was Konsole druckt:
TEST3
[:]
TEST
"ZuUiTSu142P5NTc9VfekRbuFcny2": {
address = "testAddress";
email = "[email protected]";
name = "testuser";
phonenumber = "1234567890";
rol = Customer;
}]
TEST2
"ZuUiTSu142P5NTc9VfekRbuFcny2": {
address = " testAddress ";
email = " [email protected] ";
name = "testuser";
phonenumber = "1234567890";
rol = Customer;
}]
Es ist überhaupt nicht seltsam: 'observeSingleEvent' arbeitet ** asynchron **, die Daten werden später in der Schließung zurückgegeben. Sie benötigen einen Completion-Handler, etwas direkt zurückzugeben ist unmöglich. – vadian
Mögliches Duplikat von [Zurückgeben von Daten aus einem asynchronen Aufruf in der Swift-Funktion] (http://stackoverflow.com/questions/25203556/returning-data-from-async-call-in-swift-function) – Keiwan