У меня есть коллекция объектов товара (title, desc, price, Quant, urlString и т. Д.) В коллекции Firestore. В настоящее время около 1000 предметов, но это может пойти до 10к. При запуске приложения для 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)
Я подробно ознакомился с документацией по пожарному магазину, но не уверен на 100%, что этот подход надежен или эффективен.
Вопрос: Когда приложение запустится, Firestore будет загружать все 10 тыс. Документов каждый раз, прежде чем описывать изменения? Или он будет кешировать все 10 Кб в первый раз, а затем загружать изменения только при последующих запусках. Я уверен, что после того, как событие изменения сработало, все последующие события будут получать только изменения в базе данных Firestore. Что меня беспокоит, так это первая подписка на слушателя, когда приложение запускается, оно загружает все 10 тыс. Элементов (что будет дорого).
РЕДАКТИРОВАТЬ 9 января 2019 г .:
В итоге я реализовал элегантный ответ @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)