2016-10-21 18 views
0

私は、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に格納する方法はありますか?

ありがとうございます。

+0

@Dravidian答えは点にあります。同様に別の問題があるかもしれません。あなたのPostクラスはシングルトンですか?そうでない場合は、全体の戦略を再検討することができます。答えが示すように、Firebaseは非同期であり、Firebaseがインターネットからデータを取得するための時間が許されなければならず、その時には常に遅れがあります。したがって、Firebaseがデータを取得する前にデータを操作しないようにする必要があります。 Firebaseデータはブロック内でのみ有効です(クロージャ)ので、データが返されるまでそのデータには作用しません。それを一連のオブジェクトで行うのは難しいことです。 – Jay

+0

ええ、私はそれが非同期であると読んだとき、私は何をすべきかを知っていました。戦略を変えなければならなかった。 –

答えて

2
DataService.ds.REF_USERS.child(self._comment1User!).observeSingleEventOfType(.Value 

非同期呼び出しである、だから、completionBlockの内側にあなたの印刷機能にアクセスし、あなたがcompletionBlock内でごcollectionViewを更新する必要があります。

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) 
       // Update your collectionView  
     }) 

非同期呼び出し年代には、異なるネットワークのスレッドにロードされているので、サーバーからDBを取得するには、いくつかの時間がかかります。

あなたはカスタムクラスとの間の通信のために探しているなら、あなたは私のこの答えを見てのViewController: - https://stackoverflow.com/a/40160637/6297658

関連する問題