【发布时间】:2019-06-03 10:18:18
【问题描述】:
我在 Firestore 集合中有一组产品对象(标题、描述、价格、量化、urlString 等)。目前大约有 1000 个项目,但可能会达到 10k。在我的 iOS 应用启动时,我设置了一个集合侦听器 (db.collection("products").rx.listen()),然后将更改保存到本地 Realm 数据库。
.subscribe(onNext: { querySnapshot in
querySnapshot.documentChanges.forEach { docChange in
autoreleasepool {
let realm = try! Realm(configuration: Realm.Configuration.defaultConfiguration)
let newData = docChange.document.data()
if let item = itemFactory.createItem(using: newData) {
if (docChange.type == .added) {
//realm.add(item)
}
if (docChange.type == .modified) {
//realm.update(item)
}
if (docChange.type == .removed) {
//realm.delete(item)
}
}
}
}
}, onError: { error in
print("Error fetching snapshots: \(error)")
}).disposed(by: disposeBag)
我已经详细阅读了 firestore 文档,但我不是 100% 确信这种方法是可靠的或高效的。
问题:当应用启动时,Firestore 会在描述更改之前每次下载所有 10k 文档吗?或者它会在第一次缓存所有 10k,然后仅在后续启动时下载更改。我确信一旦触发了更改事件,所有后续事件都只会获取对 Firestore 数据库的更改。我担心的是在应用程序启动时首先订阅侦听器,它会下载所有 10k 个项目(这将是昂贵的)。
2019 年 1 月 9 日编辑:
我最终实现了@zavtra 优雅的答案,代码大致如下:
var newestUpdatedAt = UserDefaults.standard.double(forKey: kUDItemUpdatedAt)
//...
db.collection(kProducts)
.whereField(kUpdatedAt, isGreaterThan: newestUpdatedAt)
.rx.listen()
//...
querySnapshot.documentChanges.forEach { docChange in
autoreleasepool {
let realm = try! Realm(configuration: Realm.Configuration.defaultConfiguration)
let newData = docChange.document.data()
if let item = itemFactory.createItem(using: newData) {
if item.updatedAt > newestUpdatedAt {
newestUpdatedAt = item.updatedAt
}
if (docChange.type == .added) {
//realm.add(item)
}
if (docChange.type == .modified) {
//realm.update(item)
}
if (docChange.type == .removed) {
//realm.delete(item)
}
}
}
}
UserDefaults.standard.set(newestUpdatedAt, forKey: kUDItemUpdatedAt)
【问题讨论】:
标签: ios swift firebase realm google-cloud-firestore