2017-05-27 116 views
0

我有一個函數,我想作爲用戶值的觀察者,以及在呈現視圖時設置一些初始值。Firebase觀察者在viewDidLoad中調用時沒有觀察數據庫更改

func getParticipantInfo() { 
    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 { 
        self.createAvatar(senderId: uid, senderDisplayName: name, photoUrl: avatar, color: UIColor.lightGray) 
        self.navCollectionView?.collectionView?.reloadData() 
       } 
      } 
     } 
    }) 
} 

如果我在viewDidAppear中打電話給這個,這個效果很好。它從數據庫抓取用戶信息,設置字典,並且一切正常。最重要的是,如果有人添加到房間(就像聊天室),該功能會更新字典以包含新用戶的值。

但是,我需要在viewDidLoad中調用它,而不是viewDidAppear。當我這樣做時,它可以設置初始值,但是當有人被添加到房間時,這不會反映在應用程序中,直到我離開視圖並再次返回,因此它不是「觀察」它的方式viewDidAppear

爲什麼突然叫它viewDidLoad讓它停止正常觀察?我如何能夠以實時反映viewDidAppear的變化?

+0

我以爲我在某處閱讀最佳做法是將其設置在viewWillAppear –

+0

我的答案是否回答您的問題。 – joshLor

+0

snapDict *中每個*的用途是什麼? .childAdded一次加載一個孩子,所以應該沒有任何東西可以迭代。看起來循環會運行一次,所以不需要。 – Jay

回答

0

我現在不是爲什麼,但這爲我解決了這個問題。我所要做的就是將.childAdded更改爲.value,並且所有事情都開始按照我的預期工作。我知道這可能不是最好的做法,但它是解決問題的簡單方法。

+0

使視圖加載時使'.value'導致崩潰。不知道爲什麼... – KingTim

+0

@KingTim有趣的嘗試刪除Firebase Closure中的代碼並嘗試.value,它有可能是在閉包中導致完全獨立的問題? – joshLor

+0

@KingTim .childAdded和.value是兩個完全不同的東西。 .childAdded將逐個遍歷節點中的每個子節點,並將它們呈現在快照中。這與問題中的代碼相符。使用.value一次加載節點中的* everything *並將其顯示在快照中。該快照需要迭代以捕獲每個子節點。因爲這個原因,這個答案是不正確的,因爲代碼會根據使用哪個而不同。 – Jay