ios - 当连接值发生变化时,Firebase 数据不会更新

标签 ios swift firebase firebase-realtime-database

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

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

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)
        }
    })
}

感谢您的帮助!

最佳答案

您需要像这样调用self.tableView.reloadData():

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

此外,无需调用viewDidAppear中的函数。在viewDidLoad中调用它。

关于ios - 当连接值发生变化时,Firebase 数据不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531076/

相关文章:

ios - Xcode 中代码行之间的空间越小,构建/应用程序的速度越快,还是没有什么不同?

ios - SFSpeechRecognizer 识别几个命令词而不是整个短语?

iOS 从用户文档 Firebase Firestore 存储/更新和检索位置数据

iphone - -drawRect : 中的可点击文本

android - 如何将适用于 Android 和 iOS 的相同 Google Analytics 属性链接到 AdMob

ios - 解析 iOS 问题关闭登录 View

swift - 使用自定义解码器解码 Firestore 结构时获取 DocumentID

ios - MKPolygon 中的邮政编码

ios - 如何更改 UICollectionViewCell 初始布局位置?

javascript - 如何分离对象内的对象