Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在viewDidLoad中调用Firebase observer时未观察到数据库更改_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 在viewDidLoad中调用Firebase observer时未观察到数据库更改

Ios 在viewDidLoad中调用Firebase observer时未观察到数据库更改,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我有一个函数,我想作为用户值的观察者,并在显示视图时设置一些初始值 func getParticipantInfo() { let groupRef = databaseRef.child("groups").child(currentRoomIdGlobal) groupRef.observe(.childAdded, with: { snapshot in if let snapDict = snapshot.value as? [String : AnyOb

我有一个函数,我想作为用户值的观察者,并在显示视图时设置一些初始值

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()
                }
            }
        }
    })
}
如果我在
viewdide
中调用此选项,则效果非常好。它从数据库中获取用户信息,设置字典,一切正常。最重要的是,如果有新用户加入聊天室(就像聊天室一样),该函数将更新字典以包含新用户的值

但是,我需要在
viewDidLoad
中调用它,而不是
viewDidAppear
。当我这样做时,它可以设置初始值,但是当有人被添加到房间中时,这不会反映在应用程序中,直到我离开视图并再次返回,因此它不会“观察”视图中的显示方式


为什么在
viewDidLoad
中调用它会突然使它停止正常观察?我如何使它像在
视图中显示的那样实时反映更改?

我现在不知道为什么,但这解决了我的问题。我所要做的就是改变
.child将
添加到
.value
中,一切都开始按照我的预期工作。我知道这可能不是最佳做法,但这是解决问题的简单方法。

我想我在某个地方读到过最佳做法是在视图中设置此选项。我的答案不会回答您的问题。snapDict中每个选项的用途是什么。childAdded一次加载一个子对象,因此应该没有任何内容可重复。循环似乎只运行一次,因此不需要它。问题中的代码可以从viewDidLoad调用。但是,它可能会因初始化方式的不同而有所不同。您是否可以更新您的问题,以包含显示如何创建视图以及viewDidLoad函数的代码(请仅包含代码片段!)?您的数据结构是什么。您的代码使它看起来好像您有一个对象组和一堆子对象,并且您正在迭代这些子对象中的信息。这就是您正在尝试执行的操作。将其设置为
.value
会在加载视图时导致崩溃。不知道为什么…@KingTim有趣尝试删除Firebase闭包中的代码并尝试.value,是否可能是闭包中的某个东西导致了完全不同的问题?@KingTim.childAdded和.value是两个截然不同的东西。childAdded将迭代节点中的每个子节点,每次迭代一个,并在快照中显示它们。与问题中的代码匹配。使用.value一次加载节点中的所有内容,并将其显示在快照中。然后需要迭代该快照以捕获每个子节点。因此,这个答案是不正确的,因为根据所使用的数据结构,代码会有所不同。@KingTim您的数据结构是什么