ios - child 因扇出而改变

标签 ios swift firebase firebase-realtime-database

考虑以下数据库结构 -

tasks
    task1
        title: "My first task"
        uid: "user1"
user-tasks
    user1
        task1: true

要观察特定用户任务的变化,您可能会想要实现这样的东西 -

ref.child("user-tasks").child(uid).observe(.childChanged...

但问题是对标题的任何更改都不会反射(reflect)在用户任务中,因此 childChanged 事件不会触发。如果您观察所有任务,那么对其他用户的任务的任何更改都会导致观察者不必要地执行。此外,所需的实现将处理其他用户/设备对任务的更新,并且更新将正确触发。

到目前为止,我唯一的想法是将 true 替换为时间戳,该时间戳会在更改时更新并触发观察者。有更好的办法吗?

最佳答案

这取决于您想要实现的目标。例如:如果您想显示当前用户的任务名称列表,则您当前的数据模型确实需要两种类型的监听器:

  1. /user-tasks 下用户任务列表的监听器。
  2. /tasks 下监听用户的每个可见任务以获取名称。

这会产生 1+N 个监听器,其中 N 取决于 UI 中可见的任务数量。虽然这对于 Firebase 来说通常不是技术问题,但需要付出一些努力才能在代码中正确管理监听器。

另一种方法是在 /user-tasks 下复制每个任务的名称:

user-tasks
    user1
        task1: "My first task"

使用此数据结构,您只需监听 /user-tasks 即可获取显示任务列表的所有信息。但反过来,您现在必须处理 keeping the duplicated data up to date在写操作中。

这里没有单一的最佳实践:这完全取决于您的应用程序的需求以及您复制数据、管理监听器以及应用程序的读写性能要求的意愿。

关于ios - child 因扇出而改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375734/

相关文章:

ios - 仅当用户进入指定区域时触发 localNotification

swift - Firebase-Swift 如何将子值相加

ios - Swift 编译器 : cannot subscript a value of type '[NSObject]' with an index of type '()'

android - Firebase 应用分发上传错误,缺少有关 APK 路径的信息

javascript - Angular - 方法不等待从 Firebase 获取值

ios - 如何 "restart"应用程序ios

android - chromecast 如何连接到其他设备?

swift - 使用 Firebase 安全规则,如何在不公开整个节点的情况下检查可用的用户名?

android - 在 xmpp 聊天中发送贴纸的最佳方式

ios - InvalidFirebaseData',原因 : '(setValue:)