使用observe方法观察FIRDatabaseQuery时,有时需要10~13秒才能从远程数据库获取数据。这主要发生在应用程序来自后台或刚刚启动时。此查询完成后,后续查询将超快速地返回远程数据。然后问题就不再出现了。
这是我用来观察的代码:
public static func observeMatchEvents(match: Match) -> QueryObserver
{
FIRDatabase.database().reference().child("events").queryOrdered(byChild: "match_id").queryEqual(toValue: match.identifier)
log.debug("Started getting match events...")
let observer = query.observe(FIRDataEventType.value, with: { (snapshot) in
log.debug("This sometimes takes 10~13 seconds before it gets executed")
// Handle data
})
return QueryObserver(query: query, handle: observer)
}
这是我的 Firebase 数据库中的结构:
其中 events 是数据库根的子级。
我正在使用 Firebase 规则来改进索引,如文档中所述:
"events": {
".indexOn": ["match_id", "type", "sub_type"]
}
我认为这与启动时必须打开的套接字有关。然而10~13秒的时间确实很长。还有其他人经历过这种行为吗?有人有办法加快这种速度吗?
编辑: 因此,在尝试了此处发布的建议并尝试了其他事情之后,我终于找到了解决方案。实际上有两个问题:
1) 当我同时开始观察太多查询时,速度变慢了。由于数据量相当大,因此需要很长时间才能完成这些观察调用。这在时间分析器中也可见,您会看到此时的 CPU 负载非常大。
2)我发现更麻烦的是设置 FIRDatabase.database().persistenceEnabled = true 会显着增加查询的回调时间。全新安装应用程序并从 Firebase 获取数据时,速度非常快。然而,每次 Firebase 数据库将更多数据写入磁盘时,响应时间都会增加,每个请求会增加 10 毫秒以上。这样,应用程序最终最多需要 10 秒才能完成对数据库的请求。我们也注意到 Android 应用程序也有同样的行为。这里唯一的解决方案是完全禁用数据库的持久性。
最佳答案
根据数据库的大小进行搜索会很慢。理想情况下,您应该在数据库中创建一个不同的节点,其中键是 match_id,然后搜索速度会很快。像这样的事情:
{
"matches": {
"vodiudtnlmdrjiqhkkdowc15": {
"subvodiudtnlmdrjiqhkkdowc156hii1jc7phspraa81xp9kuj85ezviixcyaaj162saxs2yl127s9": true
}
}
}
然后您可以查询:
.child('matches').child(match.identifier)
这将为您提供具有该比赛 ID 的所有赛事。一旦掌握了这些信息,您就可以循环遍历这些记录并直接获取各个记录。为了使这些数据保持最新,请查看 firebase 函数或推出您自己的函数。
这将非常快,因为它根本不需要进行搜索。
关于ios - Firebase 数据库观察速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43492351/