gpt4 book ai didi

ios - Swift 中字典对象的 Firebase 实时问题

转载 作者:行者123 更新时间:2023-11-29 05:13:09 24 4
gpt4 key购买 nike

我正在使用 Firebase 实时获取数据。我的表格结构如下。

"Bidding": {
"-LwyoIpE-obs1244Zflz": {
"Images": {
"-LwyoIxdDbabEzKDNjz0": {
"image": "bookings/15773068970yg5i.png",
"imgae_key": "-LwyoIxdDbabEzKDNjz0"
},
"-LwyoIxei2rxOOrJAxhD": {
"image": "bookings/1577306897vIXfc.png",
"imgae_key": "-LwyoIxei2rxOOrJAxhD"
}
},
"booking_id": "1128",
"category_id": "4",
"consumer_id": "143",
"consumer_image": "/uploads/1576824430.jpeg",
"created_obj": "2019-12-25 20:48:17",
"date_time": "2019-12-26 01:47:34",
"description": "Good",
"email": "dev@consumer.com",
"job_type": "1",
"lat": "37.785834",
"lng": "-122.406417",
"order_refrence": "GATK-S-2127",
"record_id": "-LwyoIpE-obs1244Zflz",
"sub_category_id": "22",
"tile": "Contracting works - polish​"
},
}

在 View 加载时,我已成功获取“图像”数据。我调用 Firebase 节点并获取图像数据。

Database.database().reference().child("Bidding").observe(.childAdded, with: { (snapshot) in
if snapshot.exists() {
let values = snapshot.value as! [String: Any]
let profile = values["consumer_image"] as? String ?? ""
let images = values["Images"] as? Dictionary<String, Any>
print(messages)
}
})

但问题是,当节点图像中添加的新子节点实时为零时。当我重新加载 View Controller 图像时,图像变得很好。请帮忙。

最佳答案

由于问题仅在您从代码中添加新数据时发生(而不是在重新加载时),因此我怀疑您通过多次调用 setValue(...)< 添加新节点updateChildValues(...)。例如:

let newChildRef = ref.child("Bidding").childByAutoId()
newChildRef.child("booking_id").setValue("1128")
newChildRef.child("consumer_image").setValue("/uploads/1576824430.jpeg")

在上面的代码中,第一个 setValue 调用将触发您的 .childAdded 监听器。由于此时您还没有为 consumer_image 属性编写值,因此监听器中 profile 的值将为 nill

第二次调用 setValue 会触发 .childChanged 事件,而您并未监听该事件。

您有两种选择来解决该问题:

  1. 在一次写入操作中写入节点的所有属性。
  2. 监听节点的更新。
<小时/>

在单个写入操作中写入节点的所有属性

为了防止在您只为节点写入部分数据时触发 .childAdded,您需要确保在一次调用 setValue() 中写入所有数据updateChildValues()updating specific property values 上的文档展示了一个很好的例子。对于上面的代码片段,这将转换为:

let values = ["booking_id": "1128",
"consumer_image": "/uploads/1576824430.jpeg"]

ref.child("Bidding").childByAutoId().setValue(values)

由于现在只有一次对 setValues 的调用,因此您的 .childAdded 监听器将使用您在该(第一个/唯一)调用中传递的所有值来触发。

<小时/>

监听节点的更新

上述解决方案的替代方案是使用.childChanged监听器监听节点的更新。在这种情况下,您的监听器将必须处理某些属性可能尚不存在的情况。

类似于:

Database.database().reference().child("Bidding").observe(.childChanged, with: { (snapshot) in
let values = snapshot.value as! [String: Any]

if let profile = values["consumer_image"] {
print(profile)
}
})

关于ios - Swift 中字典对象的 Firebase 实时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59486317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com