2017-05-12 4 views
0

データベースの監視を担当する機能があります。最初の読み込み時にいくつかの辞書を設定し、その後の変更を監視し、それに従って辞書を更新します。 viewDidAppearで呼び出されると、これは完全に機能します。しかし、それをviewDidLoadに移動すると、最初に値が設定されますが、 "観察"されません。つまり、ステータスなどの値のいずれかが変更された場合、ビューを終了して戻ってこない限り。viewDidLoadでオブザーバとして機能していないデータベースオブザーバ関数、viewDidAppearのみ

私は他の理由のためにviewDidLoadでそれを持っている必要があります - なぜまさにそれはviewDidAppearでいた場合にのみ正常にオブザーバーとして働く、と私はそれがviewDidLoadにオブザーバーとして動作させるために変更できるものがありますか?

これは、関数である:私は見ることができます

func getParticipantInfo() { 

    let databaseRef = FIRDatabase.database().reference() 

    let groupRef = databaseRef.child("groups").child(currentRoomIdGlobal) 
    groupRef.observe(.childAdded, with: { snapshot in 

     if let snapDict = snapshot.value as? [String : AnyObject] { 

      for each in snapDict { 

       let uid = each.key 
       let avatar = each.value["profilePicture"] as! String 
       let gender = each.value["gender"] as! String 
       let handle = each.value["handle"] as! String 
       let name = each.value["name"] as! String 
       let status = each.value["status"] as! String 

       // Set those to the dictionaries [UID : value] 
       self.avatarDictionary.setValue(avatar, forKey: uid) 
       self.nameDictionary.setValue(name, forKey: uid) 
       self.genderDictionary.setValue(gender, forKey: uid) 
       self.handleDictionary.setValue(handle, forKey: uid) 
       self.statusDictionary.setValue(status, forKey: uid) 
       DispatchQueue.main.async { 
        // Nav bar 
        self.navCollectionView?.collectionView?.reloadData() 
       } 
      } 
     } 
    }) 
} 

答えて

0

一つの理由は、あなただけ.childAddedイベントを観察しているということです。イベントをトリガーするには、すべての変更を購読する必要があります。 .valueイベントを購読してください。このイベントは、データベースのすべての変更をリッスンし、アプリに反映されます。

viewDidLoadviewDidAppearまでは、サブスクライバをFirebaseに接続する前に、すべてのクラス変数が設定されていることを確認してください。 viewDidLoadまたはviewDidAppearは、設定が正しい限り重要ではありません。

関連する問題