我有一個函數,我想作爲用戶值的觀察者,以及在呈現視圖時設置一些初始值。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
的變化?
我以爲我在某處閱讀最佳做法是將其設置在viewWillAppear –
我的答案是否回答您的問題。 – joshLor
snapDict *中每個*的用途是什麼? .childAdded一次加載一個孩子,所以應該沒有任何東西可以迭代。看起來循環會運行一次,所以不需要。 – Jay