Мы создаем приложение для чата в реальном времени, используя Firestore.Нам нужно разобраться с ситуацией, когда интернет-соединение отсутствует.Основной код отправки сообщения выглядит следующим образом
let newMsgRef = database.document(“/users/\(userId)/messages/\(docId)“)
newMsgRef.setData(payload) { err in
if let error = err {
// handle error
} else {
// handle OK
}
}
Когда устройство подключено, все работает нормально.Когда устройство не подключено, обратный вызов не вызывается, и мы не получаем статус ошибки.
Когда устройство возвращается в оперативный режим, запись появляется в базе данных и инициирует обратный вызов, однако это решение неприемлемодля нас, потому что в то же время приложение могло быть прекращено, и тогда мы никогда не получим обратный вызов и не сможем установить статус сообщения как отправленного.
Мы думали, что отключение автономного сохранения (которое включено по умолчанию) заставит его немедленно вызвать аварийный обратный вызов, но неожиданно - нет.
Мы также попытались добавить тайм-аут, после которогооперация отправки будет считаться неудачной, но невозможно отменить доставку сообщения, когда устройство снова подключено к сети, поскольку Firestore использует свою очередь, и это вызывает еще большую путаницу, поскольку сообщение доставляется на стороне получателя, а я не могу с этим справитьсяна стороне отправителя.
Если бы мы могли уменьшить время ожидания - это могло бы быть хорошим решением - мы бы быстро получили состояние успеха / неудачи, но Firebase не предоставляет такой настройки.
Еще одним вариантом может быть встроенный автономный кэш, я могу рассматривать все записи как успешные и полагаться на механизм синхронизации Firestore, но если приложение было прервано во время автономного режима, сообщение не доставляется.
В конечном итоге нам нуженпоследовательный механизм обратной связи, который будет вызывать обратный вызов, илиспособ отслеживания сообщения в очереди и т. д., поэтому мы точно знаем, что сообщение было отправлено или не было отправлено, и когда это произошло.