【发布时间】: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