连接值更改时 Firebase 数据未更新

Posted

技术标签:

【中文标题】连接值更改时 Firebase 数据未更新【英文标题】:Firebase data not getting updated when joined value changes 【发布时间】:2017-06-13 20:36:28 【问题描述】:

我正在创建一个带有 TableViewController 的 Swift Firebase 应用程序,其中 tableview 的每个部分都是一个房间,每一行都是每个房间的家具。

现在问题来了:第一次加载时一切正常,当任何房间从后端更改/删除时,表格视图更新就好了。但是当我的任何家具值更新时,我无法重新加载数据。我不知道如何更改我的代码以使其正常工作。我开始认为我可能使用了不正确的数据结构?我该如何解决这个问题?

Firebase 数据库的结构是这样的(我从结构中删除了一些键/值只是为了简化,以便真正的结构具有更多值):

rooms:

    "room 1": 
        "name": "Bedroom",
        "somedata": 1
    ,
    "room 2": 
        "name": "Living room",
        "somedata": 2
    


furniture:

    "room 1": 
        "furniture 2": 
            "name": "Chair"
        ,
        "furniture 3": 
            "name": "Sofa"
        
    ,
    "room 2": 
        "furniture 1": 
            "name": "Table"
        
    

我用来在 TableViewController 中加载数据的代码是:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    DataManager.shared.getRooms(completion:  (rooms) in
        self.rooms = rooms
        self.tableView.reloadData()
    )

数据管理器:

func getRooms(completion:@escaping ([Room])->Void) 
    FIRDatabase.database().reference(withPath: "rooms").observe(.value, with:  snapshot in
        var rooms: [Room] = []
        var counter: UInt = 0
        for roomItem in snapshot.children 
            let room = Room(snapshot: roomItem as! FIRDataSnapshot)
            FIRDatabase.database().reference(withPath: "furniture/\(room.key)").observe(.value, with:  snap in
                for furnitureItem in snap.children 
                    let furniture = Furniture(snapshot: furnitureItem as! FIRDataSnapshot)
                    room.furnitureList.append(furniture)
                

                counter = counter + 1
                if (counter == snapshot.childrenCount) 
                    completion(rooms)
                
            )

            rooms.append(room)
        
    )

感谢您的帮助!

【问题讨论】:

要在这里尝试一下,也许尝试将完成回调包装在异步调度中? 我认为不需要它?请看下面的评论 嗯,仅能看到这么多很难确定问题所在。您是否可以尝试仔细检查一下您的回调是否在您更换家具后被调用? 【参考方案1】:

您需要像这样拨打self.tableView.reloadData()

DispatchQueue.main.async 
    self.tableView.reloadData()

另外,无需调用viewDidAppear 中的函数。打电话给viewDidLoad

【讨论】:

非常感谢!据我了解,您不需要使用 DispatchQueue,因为这已经在主线程上发生,至少根据这篇文章:***.com/questions/39178165/… 我把它放在 viewWillAppear 中,因为如果这篇博文 firebase.googleblog.com/2015/10/…) 它说“在 viewWillAppear 中创建侦听器,而不是在 viewDidLoad 中”。对不对? 观察地点:***.com/questions/37895171/…

以上是关于连接值更改时 Firebase 数据未更新的主要内容,如果未能解决你的问题,请参考以下文章

将电子邮件更新到 firebase

Firebase Auth 密码重置 iOS Swift - 更新 Firebase 数据库

尝试在 vuejs 中更新 firebase 文档时,我无法解决此未定义字段问题

Xcode UI 未使用最新的 Firebase 值更新

如何在快速更改(Firebase)时接收/更新数据

适用于 Android 的 Firebase 推送通知