【问题标题】:Firebase taking long time to write document and freezing appFirebase 需要很长时间来编写文档并冻结应用程序
【发布时间】:2020-02-17 17:12:27
【问题描述】:

我正在尝试将数组写入 Firebase 上的文档,如下面的代码所述。但是,当该数组包含 100 个项目(仅名称为字符串,因此数据量没有问题)时,它会将应用程序冻结一分钟,并在控制台中收到消息

无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应。 这通常表明您的设备目前没有健康的互联网连接。客户端将在离线模式下运行,直到能够成功连接到后端。

互联网连接很好。这个问题也发生在只有 20 个项目的较小数组上,但不是很明显。

我做错了什么导致应用需要这么长时间才能写入 Firebase?

func saveDocOnline() {

    let db = Firestore.firestore()

    db.collection("Collection 1").document("Document 1").setData([
        "Array" : loadItems()
    ]) { (error) in
        if let e = error {
            print("Error saving: \(e)")
        } else {
            print("Successfully Saved Online")
        }
    }
}

func loadItems() -> [String] {
    var itemTitle: [String] = []

    itemTitle = ["Generic", "Generic Bars", "Generic Restaurants" ... "Halloween", "Jazz", "Xmas", "Acid Jazz"]

    return itemTitle

}

【问题讨论】:

  • 我使用分配给 itemTitle 的 1,000 个单词的列表将问题中的确切代码复制并粘贴到应用程序中。代码运行不到 1 秒。然后,我将您的代码放入一个紧密循环中并运行了 100 次。它完美地工作。这告诉我问题不在该代码段之外。您可能在某处使用 DispatchGroup 吗?

标签: swift firebase google-cloud-firestore


【解决方案1】:

很奇怪。不是 100% 确定是什么原因造成的。我尝试加载类似大小的数据没有问题,但我会尝试一些事情。

  1. 调用内部函数作为 setData() 的参数可能会出现问题。尝试在setData line 之前使用let data:[String:[String]] = loadData() 初始化loadData 的内容。然后使用data 作为参数而不是loadData()。这将做两件事,如果 Firebase 由于某种原因遇到问题,它将有助于类型推断,如果 firebase 不喜欢这样,它会限制函数的范围。

  2. (编辑:忽略此建议,只需重读您的帖子,我可以看到您尝试过此操作)还可以尝试使用较小的数组,看看您是否可以成功写入 50 个项目。如果可行,请选择 75,或者如果不尝试 25。等等。在这种情况下,您可以放置​​的数组中的项目数量可能会受到限制,但这将是 firebase 的一个非常奇怪的限制.

  3. 尽量不要使用关键字数组,我认为这不会影响它,但为了安全起见。

所有这些解决方案,如果它们有效的话,会在 firebase 框架内部提出一些奇怪的问题,但至少你可以消除可能性。

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多