gpt4 book ai didi

ios - Swift - Firebase 数据库查询项目范围

转载 作者:行者123 更新时间:2023-11-28 15:19:07 25 4
gpt4 key购买 nike

考虑以下数据库树:

root: {
followees: {
<uid-1> : {
// list of all users "uid-1" is following (each child node is a different FCM topic)
<uid-1-1>: true, // true = subscribed to FCM topic
<uid-1-2>: false,
// theoretically, "uid-1" could be following millions of users, but 100k is probably a more reasonable maximum
}
<uid-2> : {
// list of all users "uid-2" is following
}
}
}

迭代子树中所有 child 的最有效和最节省内存的方法是什么?

我使用一次读取 1000 个 child 的限制查询创建了一个递归解决方案。这行得通,但是由于递归的原因,所有子项都存储在内存中,直到遇到基本情况为止;这与一次加载所有子项本质上是一样的。

我想过清除 observeSingleEvent(.value) 返回的集合,但这行不通,因为集合是不可变的。

我能想到的最佳解决方案是查询数据库中的前 1000 个 child ,然后是第二个 1000 个,依此类推:

query(startIndex:0, endIndex:999)
query(startIndex:1000, endIndex:1999)
query(startIndex:2000, endIndex:2999)
...

这如何使用 Firebase 完成?完全可以做到吗?是否应该重新设计我的数据库结构,使子树不能包含数百万个条目?

感谢任何建议!

附言如果您有兴趣,这是我的递归解决方案。请注意,它不是有效的 Swift 代码——它只是展示了概念。

func iterateChildren(startingAt: String, block: (child) -> Void) {
// The actual query would use queryStartingAt and queryLimited.
ref.query { children in
// Used in recursive call.
var nextStartingId: String? = nil

for (index, child) in children.enumerated() {
if (UInt(index) == limit - 1) {
// Firebase Database's queryStarting(atValue:) method is inclusive of
// atValue, so skip the last item as it will be included in the next
// iteration.
nextStartingId = child.key
break
}
block(child)
}

if (nextStartingId != nil) {
self.iterateChildren(startingAtId: nextStartingId, block: block)
}
}
}

最佳答案

不要使用单一的大 child ,尽量使用小而简洁的 child 。为什么你不试着用一些逻辑来对你的子 child 进行分组?

一个不错的解决方案可能是按插入日期对数据进行分组(但取决于您的用例):

root : {
child : {
"20/09/2017" : {
"uid" : true
},
"21/09/2017" : {
"uid" : false
"uid" : true
}
}
}

使用此解决方案,您可以使用 observe(.childAdded) 迭代您的子节点,其中每个 completionHandler 都会为您提供一小块数据。

无论如何,我确信使用 .value 观察器是一个糟糕的解决方案。

Firebase 建议避免 god child,所以尽量遵循这个简单的规则:https://firebase.google.com/docs/database/ios/structure-data

关于ios - Swift - Firebase 数据库查询项目范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326492/

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