ios - Firebase 数据库观察速度慢

标签 ios swift firebase firebase-realtime-database

使用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 数据库中的结构:

Firebase Database Structure

其中 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/

相关文章:

javascript - Firebase:authWithPassword 后权限被拒绝;可能是因为 Firebase 规则

ios - CKQueryOperation resultLimit max 和请求计数

iphone - 我会丢失带有新证书的钥匙串(keychain)吗?

ios - 该 View 是 Iphone XS Max、Iphone 11 pro max 上的显示差异以及差异项目

swift - 为什么带有范围的 swift 子字符串需要特殊类型的 Range

android - Firebase数据库搜索未返回任何结果

ios - 如何进行 NSDecimal 数学运算?

iOS 11 - 基于触摸类型的 HitTest

swift - 无法将按钮焦点移动到下一行

java - firebase 中 getEmail() 的空指针异常