2016-05-07 4 views
0

ユーザーがサインインすると、そのユーザーのUIDはstandardUserDefaults()に設定されます。また、ユーザーのプロファイルデータは、自分のuidという名前の子の下に保存されます。新しい投稿に書き込むユーザー名を取得する

ユーザーが投稿を作成するときに、そのユーザー名/表示名を投稿に添付します。

現在のユーザーのユーザー名を取得する機能を設定しましたが、投稿を送信するたびにクロージャが実行されていないように見えます。

ポストモデル:

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

とユーザー名を取得する機能:私は現在のユーザーの表示名を取得し、standardUserDefaultsにそれを設定するには、私のログイン機能を設定

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

これはFirebaseの仕組みではありません。本質的に非同期なので、ブロックが完了する前にコードが実行されるため、おそらくゼロの値が返されます。あなたがブロックが完了したことを知ったら、あなたはファイアベースで次の「ステップ」に行くべきです。 Firebaseを同期関数呼び出しとして使用して値を返すべきではありません。 – Jay

+0

よろしくお願いいたします。何をお勧めしますか?最初の画面がロードされるとすぐにユーザーのログインが必要ですか?そのユーザー名をstandardUserDefaults()に設定するか、まったく別のルートを使用しますか? –

+0

可能なフローは:現在のログイン画面です。ユーザーはユーザー名とパスワードを入力します。ファイアベースで認証する - 成功した場合(Authブロック内で)ユーザーのデフォルトに書き込みます(なぜそうする必要があるのか​​不明)。次のアプリ画面に進みます。ユーザのuidは、FirebaseのauthData変数から常に利用できるので、ユーザが投稿を作成するときにそこからuidを取得します。あなたの名前のようなユーザーのために他のデータが必要な場合は、一旦認証すれば取得できます。したがって、シーケンスはauth-> get uid->ユーザーノードからユーザーデータを読み込みます - >アプリケーション – Jay

答えて

0

をどの働いた。誰かがより良い提案をしていない限り、これは私の解決策だと思います。

@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

を実行します。これは動作しますが、 '新しい投稿に書き込むためのユーザー名をキャプチャする'という質問に対する回答ではありません。このコードは、ユーザーのデフォルトにデータを書き込みます。また、ユーザーが投稿を作成するたびに、ユーザーの既定値から読み取る必要があることも意味します。また、もしユーザーが結婚して姓を変えた人、あるいはフランクリンの代わりにフランクに行くことを決めた人はどうでしょうか?つまり、すべての投稿に間違った名前が格納されます。また、あなたのelseステートメントには、ぶらぶらしたリターンがあります。一般的には、自分の質問に答えるのではなく、質問を更新する必要があります。 – Jay

関連する問題