2016-05-07 5 views
0

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 
} 
+0

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

+0

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? –

+0

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

Antwort

0

ich meine Login-Funktion eingerichtet, um den aktuellen Benutzeranzeigenamen zu erhalten und an die standardUserDefaults gesetzt die hat funktioniert. Ich glaube, das ist meine Lösung, es sei denn, jemand hat einen besseren Vorschlag

@IBAction func loginButton(sender: AnyObject) { 
     if emailField != nil && passwordField != nil { 

     let emailAttempt = emailField.text! 
     let passwordAttempt = passwordField.text! 
     DataService.ref.baseRef.authUser(emailAttempt, password: passwordAttempt) { 
      error, authData in 
      if error != nil { 
       print("error in data check") 
      } else { 
       let returnUID = authData.uid 
       NSUserDefaults.standardUserDefaults().setValue(returnUID , forKey: "uid") 
       DataService.ref.userRef.childByAppendingPath(returnUID).childByAppendingPath("Display Name").observeSingleEventOfType(.Value, withBlock: { snapshot in 
        let UserDisplayName = snapshot.value as! String 
        NSUserDefaults.standardUserDefaults().setValue(UserDisplayName, forKey: "displayName") 
        self.performSegueWithIdentifier("loginSuccessSegue", sender: sender) 

       }) 

      } 
     } 
     } else { 
     print("error") 
     return 
     } 
    } 
+0

Während dies funktioniert, ist es keine Antwort auf die Frage "Capture username in neuen Beitrag schreiben"; Dieser Code schreibt Daten in die Benutzereinstellungen. Was es auch bedeutet, dass jedes Mal, wenn der Benutzer einen Beitrag erstellt, Sie von den Standardeinstellungen des Benutzers lesen müssen. Und was ist, wenn der Benutzer eine Person ist, die geheiratet hat und ihren Nachnamen ändert, oder die Person entscheidet sich für Frank anstelle von Franklin? Das bedeutet, dass für jeden Beitrag der falsche Name gespeichert wird. In Ihrer else-Anweisung gibt es auch eine dangling return. Im Allgemeinen sollten Sie Ihre Frage aktualisieren, anstatt Ihre eigene Frage zu beantworten. – Jay

Verwandte Themen