#ios #swift #firebase #google-cloud-firestore
#iOS #swift #firebase #google-облако-firestore
Вопрос:
Я создаю приложение для обмена мгновенными сообщениями, похожее на 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")")
}
}
Обратный вызов выполняется при обновлении либо кэша, либо базы данных, но если обновляется одно, то другие обновления, после чего изменения документа удаляются. это означает, что я не могу сказать, что произошло.
Буду признателен за любой совет, заранее спасибо.
Ответ №1:
Вы можете найти именно эту информацию в SnapshotMetadata
of QuerySnapshot
, который обладает isFromCache
свойством, которое:
Возвращает «ДА», если снимок был создан из кэшированных данных, а не из гарантированных актуальных данных сервера.
Вы захотите прослушать изменения метаданных, чтобы иметь возможность обновлять пользовательский интерфейс после синхронизации данных с сервером.
Ответ №2:
Мое предложение по этому поводу заключалось бы в том, чтобы:
- Устанавливайте статус «Отправка» при вводе значения в Firebase с клиента — независимо от того, подключены вы к сети или оффлайн (Firebase уже обрабатывает этот процесс за вас, поэтому не изобретайте его заново).
- Используйте существующий обратный вызов, чтобы уведомлять вас о новых сообщениях, соответствующих тому, которое вы можете затем пометить как «Отправленное», как только вы их получите (через обратный вызов).
Чтобы упростить это, вы можете даже захотеть создать временный массив идентификаторов, которые, как вы ожидаете, будут возвращаться из Firebase после записи в Firebase DB. Это позволит вам легко проверить, что отправленное сообщение было тем, которое вы ожидали получить обратно.
Дайте мне знать, если это поможет.
Эндрю