Как Firebase обрабатывает события, происходящие в автономном режиме?

Из часто задаваемых вопросов Firebase:

Что произойдет с моим приложением, если я потеряю подключение к сети?

Firebase прозрачно повторно подключается к серверам Firebase, как только вы восстанавливаете подключение. Тем временем все операции Firebase, выполняемые вашим приложением локально, немедленно запускают события (...). Как только подключение будет восстановлено, вы получите соответствующий набор событий, чтобы ваш клиент «догнал» текущее состояние сервера.

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

Если данные на сервере переопределяются, означает ли это, что старые данные могут заменить новые?

Если новые данные, добавленные онлайн, сохраняются, знаю ли я, что данные, отправленные в автономном режиме, были удалены?


person MasterScrat    schedule 14.11.2013    source источник
comment
Если вы беспокоитесь о параллельном доступе, вы должны поместить изменения в транзакции. firebase.com/docs/transactions.html   -  person Frank van Puffelen    schedule 14.11.2013
comment
Я беспокоюсь не о параллельном доступе, а о том, что старые данные заменяют новые, или о скрытых обновлениях.   -  person MasterScrat    schedule 14.11.2013


Ответы (1)


Когда ваш клиент вернется в сеть после периода автономной работы и записи данных, поведение этих изменений будет определяться тем, какой метод вы использовали для их записи:

  • Методы set(), setWithPriority(), remove() и push() являются последними при записи. Это означает, что если автономный клиент A вносит изменения в момент времени t=0, а онлайн-клиент B вносит изменения в момент времени t=10, изменения этого автономного клиента A перезапишут изменения клиента B при повторном подключении. Обратите внимание, что это конкретно относится к внесенным изменениям (например, установить /a/b/c на 1), а не ко всему Firebase.
  • Однако метод transaction() создан специально для обработки конфликтов. Когда автономный клиент A снова подключится, ваша функция обновления транзакций запустится повторно и применит новое изменение к вашим данным Firebase.

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

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

person Rob DiMarco    schedule 14.11.2013
comment
спасибо за объяснение, но правильно ли я предполагаю, что часть transaction вашего ответа больше неверна? В автономном режиме попытки выполнить транзакцию возвращают ошибку Операция была прервана из-за отключения сети DatabaseError, а после подключения к сети транзакция не выполняется повторно. - person Voy; 28.07.2016
comment
@Rob DiMarco Это все еще относится к текущей версии 9? Как насчет включенного сохранения? Транзакции не сохраняются при перезапуске приложения. Должны ли мы по-прежнему использовать транзакции с включенной сохраняемостью? - person cybergen; 05.10.2016