【问题标题】:Swift Google Cloud Firestore Listener Memory Issue / App CrashSwift Google Cloud Firestore 侦听器内存问题/应用程序崩溃
【发布时间】:2021-11-18 13:57:54
【问题描述】:

我在 XCode 中工作,使用复合查询和 Firestore 侦听器来查询包含约 20,000 个文档的 Firestore 集合。我的内存用完了,应用程序崩溃了。在较小的数量下,这些查询执行良好(例如

我从一个单独的类中调用监听器,并存储对监听器的引用以在以后调用 .remove() (当我不再需要监听更新时)。在转义闭包中,我返回一个监听对象数组。

这是我要查询的对象的示例(它很小/扁平):

struct SomeObject: Codable, Identifiable, Hashable {
    var id: String
    var field_one: String
    var field_two: String
    var field_three: String?
    var field_four: Bool = true
}

这是查询代码:

 func listenForSomeObjects(_ completion: @escaping ([SomeObject]?, Error?) -> Void) -> ListenerRegistration? {
    let listener = db.collection("some_objects")
        .addSnapshotListener {(snapshot, err) in
            if let err = err {return completion(nil, err)}
            guard let snapshot = snapshot  else {return completion(nil, nil)}
            let objects: [SomeObject]? = snapshot.documents.compactMap{document in
                do {
                    return try document.data(as: SomeObject.self)
                }
                catch {
                    completion(nil, error)
                }
                return nil
            }
            return completion(objects, nil)
    }
    return listener
}

这是调用代码:

let listener = firebase.listenForSomeObjects() {objects, err in
        if err != nil {return store.dispatch(AlertActions.showError(err))}
        guard let objects = objects else {return}
        store.dispatch(SomeObjectActions.setObjects(objects))
}
store.dispatch(SomeObjectActions.setListener(listener))

我注意到,如果我在获取数据后立即删除监听器,内存使用量会从 ~2GB 下降到 ~100MB,但我需要监听器存活更长时间。我需要弄清楚为什么在侦听器处于活动状态时使用了这么多内存,这样我才能让它保持活跃,但我不确定如何进一步调试。

【问题讨论】:

  • 一般来说,如果为大量实体创建侦听器,则预计会占用大量内存。使用此功能处理可管理的数据量始终是 recommended。需要考虑的几件事是侦听器多久接收一次更新,内存增长需要多长时间。
  • @AkshanshaSinghal 我最终进一步减小了感兴趣对象的大小,并对听众施加了 10k 的限制。当我需要获取更多数据时,我会移除监听器,并发出多个连续的合理大小的 getDocuments 请求以获取我需要的数据...感谢反馈

标签: swift xcode google-cloud-firestore


【解决方案1】:

一般来说,如果为大量实体创建侦听器,则预计会出现高内存使用情况。使用此功能处理可管理的数据量始终是 recommended。需要考虑的几件事是侦听器接收更新的频率,内存增长需要多长时间。

此外,您可以通过设置限制和pagination 来限制一次性读取的文档数量。

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 2017-01-27
    • 1970-01-01
    • 2023-04-08
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多