Wenn sich ein Benutzer anmeldet, wird seine UID auf standardUserDefaults() gesetzt. Außerdem werden die Profildaten der Benutzer unter einem Kind mit dem Namen ihrer Benutzerkennung gespeichert.Erfassen Sie den Benutzernamen, um in den neuen Beitrag zu schreiben
Wenn der Benutzer einen Beitrag erstellt, möchte ich seinen Benutzernamen/Anzeigename an den Beitrag anfügen.
Ich habe eine Funktion eingerichtet, um den Benutzernamen des aktuellen Benutzers abzurufen, aber wenn ich einen Beitrag abschicke, scheint es so, als würde die Schließung nicht ausgeführt.
Das Post Modell:
class PostModel {
var postBody = String()
var creationDate = String()
var postUID = String()
var userName = String()
init(postBody: String) {
self.postBody = postBody
let dateObject = NSDate()
let formatDate = timeToString(dateObject)
self.creationDate = formatDate
let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String
self.postUID = userID
self.userName = getUsername(userID)
}
// Used to convert the model to json compatible before saving
func postToDictionary() -> NSDictionary {
let jsonBody = postBody
let jsonDate = creationDate
let jsonUID = postUID
let jsonUsername = userName
let postAsDictionary = ["Body": jsonBody, "Timestamp": jsonDate, "UID": jsonUID, "Display Name": jsonUsername]
return postAsDictionary
}
}
und die Funktion den Benutzernamen zu erhalten:
func getUsername(withUID: String) -> String {
var userName = String()
DataService.ref.userRef.childByAppendingPath(withUID).observeSingleEventOfType(.Value, withBlock: { snapshot in
userName = snapshot.value.objectForKey("Display Name") as! String
})
return userName
}
So funktioniert Firebase nicht. Es ist asynchron in der Natur, so dass Sie höchstwahrscheinlich einen Nullwert zurückgeben würden, da der Code ausgeführt wird, bevor der Block abgeschlossen ist. Mit Firebase sollten Sie nur zum nächsten "Schritt" gehen, sobald Sie wissen, dass der Block abgeschlossen ist. Firebase sollte nicht als synchroner Funktionsaufruf verwendet werden, um einen Wert zurückzugeben. – Jay
Okay, danke. Was würdest du vorschlagen? Soll ich mich anmelden und sobald der erste Bildschirm geladen wird, den Benutzernamen auf standardUserDefaults() setzen oder eine völlig andere Route wählen? –
Ein möglicher Ablauf ist: aktueller Anmeldebildschirm. Der Benutzer gibt den Benutzernamen und das Passwort ein. Über Firebase authentifizieren - Wenn dies erfolgreich ist (innerhalb der Auth-Blockierung), schreibe in die Benutzereinstellungen (nicht sicher, warum du das tun musst) und gehe zum nächsten App-Bildschirm. Die Benutzer-UID ist immer über die Firebase-Variable authData verfügbar. Wenn der Benutzer einen Post erstellt, erhalten Sie die UID von dort. Wenn Sie andere Daten für den Benutzer benötigen, wie ihren Namen, erhalten Sie, sobald sie auth. So ist die Reihenfolge auth-> get uid-> Benutzerdaten von Benutzerknoten laden-> weiter mit App – Jay