Ios Firebase将旧数据加载到表视图中

Ios Firebase将旧数据加载到表视图中,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我注意到,当我在浏览器上调出firebase时,我的公司表视图显示的是旧数据,而不是数据库中当前的数据。为什么?我该如何解决这个问题 databaseHandle = databaseRef?.child("companies").observe(.value, with: { (snapshot) in             for item in snapshot.children.allObjects as! [FIRDataSnapshot] { /

我注意到,当我在浏览器上调出firebase时,我的公司表视图显示的是旧数据,而不是数据库中当前的数据。为什么?我该如何解决这个问题

databaseHandle = databaseRef?.child("companies").observe(.value, with: 

{ (snapshot) in
            for item in snapshot.children.allObjects as! [FIRDataSnapshot] {
                //Load company data into company object
                let company = Company()
                company.name = item.childSnapshot(forPath: Property.name.rawValue).value as! String           
                let positions = item.childSnapshot(forPath: Property.jobtypes.rawValue).value as! String
                company.positions = positions.components(separatedBy: ", ")
                
                //Get company image
                let id = item.childSnapshot(forPath: Property.id.rawValue).value as! String
                let imageName = id + ".png"
                let imageRef = self.storageRef?.child(imageName)
                imageRef?.data(withMaxSize: 1 * 1024 * 1024) { data, error in
                    if let error = error {
                        print((error as Error).localizedDescription)
                    } else if let data = data {
                        DispatchQueue.main.async {
                            company.image = UIImage(data: data)
                            self.companyTableView.reloadData()                        }
                    }
                }
                self.informationStateController?.addCompany(company)
            }
        })

如果已将persistenceEnabled设置为true,则Firebase API返回的快照来自本地数据缓存。该数据将加载到公司对象中

在此过程中,会调用Firebase服务器,并在项目的“公司”节点上设置一个值观察者。该值将触发服务器向应用程序发送新的快照。处理第二个快照似乎是问题所在

按照完成处理程序的结构,第二个快照不会更新现有的公司对象。相反,完成处理程序将第二个快照解压到一组新的公司对象中,通过调用informationStateController.addCompany(Company)将每个对象追加到DOM中

您应该修改完成处理程序,以便它能够将快照数据与DOM中的现有公司对象关联起来,和/或能够确定快照数据是否对应于DOM中尚未存在的新公司对象。在前一种情况下,它应该更新现有的公司对象,在后一种情况下,它应该创建一个新的公司对象

我不确定是否有最佳实践,但根据我的经验,在与DOM中的对象相对应的节点上设置值观察者是很有帮助的。在您的情况下,这意味着在每个公司节点上设置观察者,而不是在集合公司节点上。通过这种方式,更容易识别和处理数据更改。要实现这一点,您可能需要从“公司”节点上的值观察者开始编译完整的公司对象集,然后从该节点删除值观察者,并用每个公司节点上的值观察者替换它

编辑:

所以,让我的原始建议更加合理:

从原始代码(稍加修改)开始,构建公司对象的DOM数组。原始代码的MOD为:

(1) 要在追加新对象之前检查数组中是否已存在公司对象,请执行以下操作:

(2) 当每个公司都添加到DOM数组中时,在每个公司的节点上调用observe.event;每个节点的完成处理程序调用相应公司对象上的方法,以便它可以使用交付的快照更新自身

同时,在“公司”节点上设置.childAdded observer。该观察器的完成处理程序基本上与您的原始代码(经过修改)相同


然后,一旦执行达到您可以知道或确信已捕获所有现有公司的程度,请从“公司”节点中删除原始的observe.event。

我也遇到了同样的问题,仍然显示旧数据。在appDelegate中,如果您有
Database.Database().isPersistenceEnabled=true
,则将与观察者一起显示旧数据的vc从
observeSingleEvent(of:.value,…)
更改为
。观察(.childAdded,…)
,这样应该可以解决问题。使用
observeSingleEvent(of:.value)
Firebase将通过
Database.Database().isPersistenceEnabled=true从手机中提取数据,然后再访问数据库以获取新信息


我点击了这个链接:

您好,您能为您的答案提供代码吗?我不知道如何“从公司节点上的值观察器开始编译一整套公司对象,然后从该节点上删除值观察器,并用每个公司节点上的值观察器替换它。”在我的
.observe(.value
handle,我应该执行
item.observe吗(.childAdded
,然后将所有属性分配给
.childAdded
句柄下的每个公司对象?您可以按照您的建议选择.childAdded路径。但是,这不会解决特定公司数据的更改。公司数据是否会不时更改,还是仅限于添加新公司?例如大多数情况下,公司对象内的数据会发生变化