iOS Firestore IsPersistenceEnabled не отключает существующие результаты кэшированного прослушивателя - PullRequest
1 голос
/ 02 апреля 2020

Кэш обычно выполняет результаты нашего первого прослушивателя снимков FireStore, почти всегда с устаревшими данными (очевидно). Слушатель часто запускает снова с отсутствующими результатами сразу после.

Использование настроек FireStore для установки isPersistenceEnabled в false не останавливает возвращение результатов кэша. Нужно ли очищать уже созданный кеш?

При проверке snap.metadata.isFromCache кеш явно работает.

Отключение сохранения, пока работает V C встроенный в настоящее ничего не делает (просмотр контейнера):

vc?.db = Firestore.firestore()
let settings = FirestoreSettings()
settings.isPersistenceEnabled = false
vc?.db?.settings = settings

Какой-то код:

var isFirstQuery = true
queuesInLocationRef?.remove()
queuesInLocationRef = db?.collection("location").whereField("city", isEqualTo: city).whereField("region", isEqualTo: region).addSnapshotListener({ (snapshot, error) in
    guard let snap = snapshot else {
         print("watch location err: ", error!)
         return
    }
    self.processDocumentChanges(documentChanges: snap.documentChanges, isFirstQuery: isFirstQuery)
    isFirstQuery = false
})

У меня есть важные вещи, которые нужно сделать при первом срабатывании слушателя. Когда у меня есть соединение inte rnet, это часто сначала срабатывает со устаревшими кэшированными результатами, которые я хочу исключить. Я попытался проверить isFromCache и досрочно вернуться, но обнаружил, что даже при сетевом подключении обновленные результаты могут возвращаться как из кэша. Это приводит к тому, что слушатель не запускает снова.

Если кэшированные результаты никогда не возвращаются, это будет плавный переход. Я не уверен, что отключение персистентности делает в iOS SDK, но здесь это не помогает.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

То, что вы описываете, решается путем указания SDK доставить события для изменения метаданных . Обязательно внимательно прочитайте эту документацию.

Когда вы регистрируетесь для изменений метаданных, ваш обратный вызов будет вызван, когда что-то в метаданных изменится, включая источник данных (даже если данные документа не изменились при все). Вот как вы можете проверить, действительно ли данные обновляются с сервера - snapshot.metadata.isFromCache должен возвращать false.

Чтобы запросить изменения метаданных, вызовите addSnapshotListener следующим образом:

query.addSnapshotListener(includeMetadataChanges: true) { documentSnapshot, error in
    // ...
}
0 голосов
/ 02 апреля 2020

Вы можете либо ограничить объем памяти, доступный для глобального кэша Firestore, либо отказаться от кэшированных результатов на основе возврата. Похоже, вы просто хотите игнорировать кэшированные результаты, поэтому просто игнорируйте их:

guard let cached = snapshot?.metadata.isFromCache,
    !cached, // only pass guard when false
    let snapshot = snapshot else {
        return
}

// handle results

Это то же самое, что и запись:

if let cached = snapshot?.metadata.isFromCache,
    cached == false {
    // handle results
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...