【发布时间】:2017-11-15 23:48:29
【问题描述】:
在 swift 中加载“相关”数据的最佳方式是什么?
通用设置,如果我有一个用户列表,所有用户都存储在 uid 节点下,并且包含一个存储 uid 的 follows 列表,例如:
"users" : {
"abc123" : {
"email" : "test@test.com",
"follows" : {
"xyz789" : true
}
},
"xyz789" : { ... }
}
为一位用户关注的所有用户加载数据的最有效方式是什么?是否最好用observeSingleEvent(of: .value) 循环遍历每个uid?
这是我想出的解决方案,但感觉有点麻烦:
func loadRelated(user: User, completion: @escaping (Bool, [UserObject]) -> ()) {
let ref = Database.database().reference(withPath: "users/" + user.uid + "/follows")
ref.observeSingleEvent(of: .value) { snapshot in
var uids = [String]()
for child in snapshot.children {
let userData = child as! DataSnapshot
uids.append(userData.key)
}
let userRef = Database.database().reference(withPath: "users")
var users = [UserObject]()
var count = 0
uids.forEach { uid in
userRef.child(uid).observeSingleEvent(of: .value) { snapshot in
let user: UserObject(from: snapshot)
users.append(user)
count += 1
if count == uids.count {
completion(true, users)
}
}
}
}
}
我真的不想走非规范化路径并将每个用户的数据存储在顶级用户下。
【问题讨论】: