2017-05-27 126 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