Есть ли способ узнать, когда документ был синхронизирован с базой данных из кэша? - PullRequest
0 голосов
/ 05 апреля 2019

Я создаю приложение для обмена мгновенными сообщениями, похожее на WhatsApp, и мне нужно отобразить статус отправки сообщения: Отправка, Отправлено; отправка выполняется в том случае, если это кэш Firebase, поскольку он не подключен к сети, и отправляется, если сообщение находится в онлайн-базе данных.

Есть ли способ узнать, был ли конкретный документ загружен в базу данных?

В настоящее время у меня есть прослушиватель обновлений в режиме реального времени, который прослушивает коллекцию сообщений в firestore, которая срабатывает при обновлении кеша или базы данных. Он может сказать, откуда пришло обновление, но возвращает все сообщения и не указывает никаких отдельных документов.

Вот фрагмент блока завершения для слушателя.

let source = snapshot.metadata.isFromCache ? "local cache" : "server"

print ("metadata: data fetched from DB: \(source)")

for diff in snapshot.documentChanges {
    print("diffData: \(diff.type.rawValue)")
    print("messageId: \(diff.document.documentID)")
    switch diff.type {
    case .added:
        print("added")
    case .removed:
        print("removed")
    case .modified:
        print("modified")
    }
}

var messages: [ChatEntry] = []
let deletedIds = [String]()
let permanentlyDeletedIds = [String]()

for document in snapshot.documents {
    if document.exists {
         let message = ChatEntry(fromSnapshot: document)
         print("MessageId: \(message?.id ?? "null")")
         print("messageText: \(message?.message ?? "Null")")
    }
}

Обратный вызов выполняется, когда обновляется кеш или БД, но если один обновляется, то другой обновляется, тогда изменения документа очищаются. это означает, что я не могу сказать, что случилось.

Любой совет будет оценен, заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Точную информацию можно найти в SnapshotMetadata объекта QuerySnapshot, который имеет свойство isFromCache , которое:

Возвращает YES, если моментальный снимок был создан из кэшированных данных, а не из гарантированных обновленных данных сервера.

Вы захотите прослушать изменения метаданных , чтобы иметь возможность обновлять пользовательский интерфейс после синхронизации данных с сервером.

0 голосов
/ 05 апреля 2019

Мое предложение по этому вопросу было бы:

  • Установите статус «Отправка», когда вы записываете значение в Firebase от клиента - независимо от того, подключены вы или нет (Firebase уже обрабатывает этот процесс для вас, поэтому не изобретайте его заново).
  • Используйте свой существующий обратный вызов, чтобы уведомить вас о новых сообщениях, соответствующих тому, которое вы можете пометить как «Отправленные», как только получите их (через обратный вызов).

Чтобы сделать это проще, вы даже можете создать временный массив идентификаторов, которые, как вы ожидаете, будут возвращаться из Firebase после записи в базу данных Firebase. Это позволит вам легко проверить, что отправленное сообщение было тем, которое вы ожидали вернуть.

Дайте мне знать, если это поможет.

Andrew

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...