ios - 观察者没有调用 swift iOS firebase 实时数据库
问题描述
我正在构建一个使用 firebase 实时数据库的应用程序。这是我的数据库内容。
在这里,每当将新的子节点添加到请求节点时,我需要获取 Phno 和 Message 值并将其打印在控制台中。这是我的观察者代码
user.observe(.childAdded) { (DataSnapshot) in
print("Inside")
if let dict = DataSnapshot.value as? NSDictionary
{
for i in dict.allKeys
{
if let data = dict[i] as? NSDictionary
{
let message = data["Message"] as! String
let phno = data["Phno"] as! String
if(message != "" && phno != "")
{
print(message)
print(phno)
}
}
}
}
我将上面的代码放在一个函数中,并第一次在 viewdidload() 中调用它。之后我尝试手动将子节点添加到请求节点,但观察者没有触发。我使用“内部”打印语句进行调试,我在日志输出中发现了一些奇怪的东西
正如您所看到的,在视图加载期间调用了一次内部,但它再次被调用,甚至没有对数据进行任何更改。如何解决此问题,以便在将新子节点添加到请求节点时调用触发器
解决方案
我认为问题是询问如何获取请求父节点中包含的子节点数据。如果是这样,试试这个:
首先,我们想在某个地方存储这些数据,所以我创建了一个类来保存每个请求,然后创建一个数组来保存所有请求
class RequestClass {
var key = ""
var msg = ""
var phone = ""
convenience init(withSnapshot: DataSnapshot) {
self.init()
self.key = withSnapshot.key
self.msg = withSnapshot.childSnapshot(forPath: "Message").value as? String ?? "no msg"
self.phone = withSnapshot.childSnapshot(forPath: "Phno").value as? String ?? "no phone"
}
}
var requestArray = [RequestClass]()
然后我们向 Request 节点添加一个观察者。.childAdded 观察者最初将遍历每个孩子,然后呈现任何新添加的孩子,然后将其添加到数组中。self.ref
是一个指向我的firebase根的类var。
func readRequests() {
let requestRef = self.ref.child("bill").child("Request")
requestRef.observe(.childAdded, with: { snapshot in
let request = RequestClass(withSnapshot: snapshot)
self.requestArray.append(request)
})
}
以上将读取问题中的节点并将每个请求存储在数组中。之后,为了测试,我们可以打印出来
self.requestArray.forEach { print($0.key, $0.msg, $0.phone)}
输出是
EEC8A no message no phone
REQ2 Hello 2353476346346
REQ3 K 12312
推荐阅读
- python - Python:如何从数据框中仅提取年月日
- selenium - 无法使用 preceeding-sibling 识别元素
- python - 为什么 open() 返回一个空变量?
- powershell - 图 API 获取令牌
- google-sheets - 如何使用带有空单元格的 Averageifs
- c# - 使用用户名和密码保护的 Web 服务使用 .NET 中的 WS-Security
- php - 从 int 数组中删除重复值而不在 PHP 中使用额外数组的最佳方法?
- out-of-memory - Glide,使用`CustomTarget会更好吗
()` 比 `CustomViewTarget ` 减少内存使用? - docker - 使用repmgr时是否需要pgpool上的看门狗?
- r - 无法复制此 ggplot2 图