私は、Firebaseの投稿データを含むコレクションビューを埋めるために使用する投稿クラスを用意しています。
いくつかのユーザーデータを取得するのに問題がありましたので、オブザーバーを投稿クラスに入れてみました。
これはうまくいくようですが、firebaseからデータを取得するのに若干の遅延がありますので、firebase呼び出しが完了する前にinit()関数を終了するようです。私はfirebaseコール内で印刷する場合Firebaseからカスタムクラス関数内のデータを呼び出す方法
class Post {
var _comment1Text: String?
var _comment1User: String?
var _comment1Name: String?
init(comment1Text: String, comment1User: String, comment1Name: String) {
self._comment1Text = comment1Text
self._comment1User = comment1User
self._comment1Name = comment1Name
if self._comment1User != "" {
DataService.ds.REF_USERS.child(self._comment1User!).observeSingleEventOfType(.Value, withBlock: { userDictionary in
let userDict = userDictionary.value as! NSDictionary
self._comment1Name = userDict.objectForKey("username") as? String
})
}
print(self._comment1Text)
print(self._comment1Name)
}
}
は、それが動作:
これはポストクラスです。
しかし、後で何らかの理由で印刷すると、comment1nameはまだ埋められていません。
collectionViewを満たすためにFirebaseのデータをself._comment1Nameに格納する方法はありますか?
ありがとうございます。
@Dravidian答えは点にあります。同様に別の問題があるかもしれません。あなたのPostクラスはシングルトンですか?そうでない場合は、全体の戦略を再検討することができます。答えが示すように、Firebaseは非同期であり、Firebaseがインターネットからデータを取得するための時間が許されなければならず、その時には常に遅れがあります。したがって、Firebaseがデータを取得する前にデータを操作しないようにする必要があります。 Firebaseデータはブロック内でのみ有効です(クロージャ)ので、データが返されるまでそのデータには作用しません。それを一連のオブジェクトで行うのは難しいことです。 – Jay
ええ、私はそれが非同期であると読んだとき、私は何をすべきかを知っていました。戦略を変えなければならなかった。 –