Firebase Realtime数据库中的Tableview并不总是更新项目

问题描述 投票:0回答:2

我正在测试我的应用程序,其中包括一个显示Firebase Realtime数据库中项目的表格视图。

每次我从应用程序到Firebase创建新对象时,表视图都会更新并包括新添加的对象。

但是我发现有时它不能保持项目的更新。

例如,如果我从应用程序内部添加新项目,它将自动包含在tableView中。

[如果另一个用户从他的应用程序内部创建了一个新项目,则两个应用程序中也会包含并更新该项目。

但是我检测到并不是所有的项目都包含在表视图中,如果直接在Firebase控制台中编辑项目,则该应用程序不会立即在表视图中更新该项目。

这是我用来填充表格视图的代码:

  databaseRef.child(codigo_chat).queryOrderedByKey().observe(.childAdded, with: { (snapshot) in


            if let valueDictionary = snapshot.value as? [AnyHashable:String]
            {
                let texto_mensaje = valueDictionary["mensaje"]
                let codigo_chat = valueDictionary["codigo_chat"]
                let datetime = valueDictionary["datetime"]
                let emisor = valueDictionary["emisor"]
                let receptor = valueDictionary["receptor"]

                self.mensajesSorted.insert(MisMensajes(codigo_chat: codigo_chat!, datetime: datetime!,emisor: emisor!, mensaje: texto_mensaje!, receptor: receptor! ), at: 0)

                self.chatTV.reloadData()
            }
        })
ios swift firebase-realtime-database
2个回答
1
投票

您需要在主队列中呼叫reloadData

DispatchQueue.main.async {
    self.chatTV.reloadData()
}

0
投票

目前,您仅观察到.childAdded事件,(仅顾名思义)该事件仅在将子级添加到该位置(并且最初是所有现有子级)时才触发。

如果您还想在修改孩子时被调用,则还应注意.childChanged事件。然后,您可以在该回调中更新该子级的现有UI。

在保存方面,您可能还要响应两个事件:

  • [.childRemoved,当从数据库中删除一个子级时,您将要从UI中将其删除。
  • .childMoved,在将孩子移动到查询结果中的其他位置时触发,通常与.childChanged事件并驾齐驱。通常,在.childMoved代码中,将孩子的UI元素移动到其新位置。
  • 另请参阅listening for child events上的Firebase文档。

© www.soinside.com 2019 - 2024. All rights reserved.