现在 Parse 即将关闭,我想开始使用 Firebase 作为我的主要 BaaS。目前,Firebase 的实时功能很有趣,我认为将来会使用它们,但现在我主要想使用 Firebase 作为存储用户及其相关数据的一种方式。使用 Parse,这非常简单,只需要上传一个对象,并将关联的用户附加到该对象。然后我可以按与该用户关联的对象进行过滤。
但是,在 Firebase 中,一切都是事件驱动的,而不是按需驱动的,您不能按安全规则进行过滤。总的来说,我喜欢这种方法,但我无法将它应用到我今天需要的东西上。我在网络/数据库方面没有太多背景,所以其中一些东西可能是非常基础的。
这是我想要做的事情:
我的 Firebase 数据结构目前如下所示:
xnterval
users
100b920f-d2c5-4578-9f49-ecf38ef71302
32a8dbf2-009a-44c5-a188-ca2c280ba135
d53b0b37-d773-4cf5-af94-74635fc76f1f
name: "Joe Schmo"
provider: "password"
username: "jschmo"
workouts
-K9wZ4_Rt-xBdVZt93d4
workout_id: "-K9wZ4_Rt-xBdVZt93d3"
workouts
-K9wZ4_Rt-xBdVZt93d3
interval_period: 180
intervals: 2
name: "Workout"
owner: "d53b0b37-d773-4cf5-af94-74635fc76f1f"
rest_period: 150
work_period: 30
在 User/"uid" 中,我有一个按 childByAutoId 排序的锻炼列表,其中包含单个锻炼的 ID。
我想要做的是获取所有用户锻炼的列表,然后从锻炼部分检索完整的锻炼列表。
我知道直接到用户锻炼根/“uid”/workouts 的路径,但是我将如何检索整个列表并获取每个“workout_id”,然后在 /workouts 部分中查询该锻炼列表?
我还已经设置了安全规则,这样其他用户就无法访问其他用户的数据,并且唯一可以读取/写入锻炼的用户是该锻炼的所有者是否是经过身份验证的用户的 UID。我确实可以正常工作。
也许我以错误的方式解决这个问题,或者有一种更简单的方法来构建我的数据以完成我想要的。我阅读了几篇关于非规范化数据的文章,以优化查询中所需的传输量,并为未来构建我觉得这种数据结构非常适合。但是如果你有更多的经验,请告诉我。谢谢!
更新
所以我创建了这个方法,它将检索所有用户的锻炼 ID 并将它们存储到数组 userWorkoutIds 中:
private func observeAllUserWorkouts() {
if userAuthData != nil {
workoutObserver = userRef?.childByAppendingPath("workouts").observeEventType(FEventType.Value, withBlock: { snapshot in
let enumerator = snapshot.children
while let child = enumerator.nextObject() as? FDataSnapshot {
NSLog("\(child.childSnapshotForPath("workout_id").value)")
self.userWorkoutIds?.append(child.childSnapshotForPath("workout_id").value as! String)
}
})
}
}
既然我确切地知道所有用户锻炼/锻炼/“ID”的路径,我如何才能一次轮询所有用户,而不是为所有不同路径设置单次观察者?或者这是唯一的选择吗?