ユーザーがサインインすると、そのユーザーの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
}
これはFirebaseの仕組みではありません。本質的に非同期なので、ブロックが完了する前にコードが実行されるため、おそらくゼロの値が返されます。あなたがブロックが完了したことを知ったら、あなたはファイアベースで次の「ステップ」に行くべきです。 Firebaseを同期関数呼び出しとして使用して値を返すべきではありません。 – Jay
よろしくお願いいたします。何をお勧めしますか?最初の画面がロードされるとすぐにユーザーのログインが必要ですか?そのユーザー名をstandardUserDefaults()に設定するか、まったく別のルートを使用しますか? –
可能なフローは:現在のログイン画面です。ユーザーはユーザー名とパスワードを入力します。ファイアベースで認証する - 成功した場合(Authブロック内で)ユーザーのデフォルトに書き込みます(なぜそうする必要があるのか不明)。次のアプリ画面に進みます。ユーザのuidは、FirebaseのauthData変数から常に利用できるので、ユーザが投稿を作成するときにそこからuidを取得します。あなたの名前のようなユーザーのために他のデータが必要な場合は、一旦認証すれば取得できます。したがって、シーケンスはauth-> get uid->ユーザーノードからユーザーデータを読み込みます - >アプリケーション – Jay