Swift中如何从Firebase追加筛选数据到数组?附代码求助
解决Swift中Firebase筛选数据追加到数组的问题
我看了你的代码,里面有几个关键细节需要调整,帮你一步步修正:
1. 修正循环中追加的对象
你现在循环里错误地把整个父snapshot添加到数组了,应该遍历每个childSnapshot,把它转换成你的DatabaseList模型后再追加:
var childrenList = [DatabaseList]() let ref = Database.database().reference(withPath: "Messages") let queryHandle = ref.queryOrdered(byChild: "VideoID").queryEqual(toValue: "12345").observe(.value, with: { (snapshot) in // 如果你需要每次查询都追加数据,就不要清空数组;如果要刷新全部数据,就加上下面这句 // self.childrenList.removeAll() for childSnapshot in snapshot.children { // 先把childSnapshot转成DataSnapshot类型,再解析成字典 guard let child = childSnapshot as? DataSnapshot, let dataDict = child.value as? [String: Any], // 把字典转成你的DatabaseList模型 let listItem = DatabaseList(dictionary: dataDict) else { continue } self.childrenList.append(listItem) } // 必须在闭包内刷新UI!因为Firebase查询是异步的,外面的代码会先执行 DispatchQueue.main.async { self.tableView.reloadData() } })
2. 给DatabaseList添加字典初始化方法
你需要让DatabaseList支持从字典解析,这样才能把Firebase返回的数据转成模型,比如:
struct DatabaseList { var videoID: String // 根据你的数据结构添加其他属性 // 从字典初始化的可选方法,处理解析失败的情况 init?(dictionary: [String: Any]) { guard let vid = dictionary["VideoID"] as? String else { return nil } videoID = vid // 初始化其他属性 } }
3. 注意异步操作的时机
原来的DispatchQueue.main.async放在闭包外面是错误的——Firebase的查询是异步执行的,外面的代码会先跑完,这时候数组还没被填充,所以必须把刷新表格的代码放在闭包内部,确保数据加载完成后再更新UI。
4. 可选:避免内存泄漏
记得在页面销毁或者不需要监听数据的时候,移除Firebase的监听:
// 在viewWillDisappear或者deinit里调用 ref.removeObserver(withHandle: queryHandle)
内容的提问来源于stack exchange,提问作者Gorib Developer
相关产品推荐
相关产品推荐

