考虑以下数据库结构 -
tasks
task1
title: "My first task"
uid: "user1"
user-tasks
user1
task1: true
要观察特定用户任务的变化,您可能会想要实现这样的东西 -
ref.child("user-tasks").child(uid).observe(.childChanged...
但问题是对标题的任何更改都不会反射(reflect)在用户任务中,因此 childChanged 事件不会触发。如果您观察所有任务,那么对其他用户的任务的任何更改都会导致观察者不必要地执行。此外,所需的实现将处理其他用户/设备对任务的更新,并且更新将正确触发。
到目前为止,我唯一的想法是将 true 替换为时间戳,该时间戳会在更改时更新并触发观察者。有更好的办法吗?
最佳答案
这取决于您想要实现的目标。例如:如果您想显示当前用户的任务名称列表,则您当前的数据模型确实需要两种类型的监听器:
/user-tasks
下用户任务列表的监听器。- 在
/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/