
“Работает офлайн” пишут почти все, а проверяется это за десять секунд: включите авиарежим и попробуйте создать запись. Если крутится спиннер или появляется ошибка, значит приложение не офлайн-first, оно просто кеширует прочитанное.
Локальная запись против кеша
Разница в направлении данных.
Кеш сохраняет то, что уже пришло с сервера, чтобы показать это без сети. Читать можно, а писать нельзя. Новая запись уходит в сеть, и без неё её просто не существует.
Офлайн-first переворачивает порядок. Источником истины становится база на устройстве. Запись создаётся локально и сразу считается настоящей, получает пометку “ещё не отправлена” и встаёт в очередь синхронизации. Появится сеть, и очередь уедет сама. Не появится сегодня, уедет завтра, и до тех пор ничего не потеряно.
Практическое следствие: интерфейс никогда не ждёт сервер. Нет состояния “сохраняем…”, нет заблокированной кнопки, нет разницы между метро и домом.
Что происходит, когда сеть возвращается
Здесь начинается самое сложное. Именно из-за этой части офлайн-first делают не все.
Пока устройство было офлайн, ту же запись могли поменять на другом устройстве. Наивное “кто последний записал, тот и прав” приводит к тихой потере правок: телефон, пролежавший в кармане неделю, приходит со старой версией и затирает свежую.
Поэтому у каждой записи есть версия и время изменения, а решение о применении принимает сервер: приходящая правка со старой версией отклоняется, а клиент помечает запись как конфликтную и сохраняет свою версию до тех пор, пока человек не решит, какая верна. Это медленнее в разработке и честнее по результату.
Удаление живёт по своим правилам
Удалённая запись не исчезает сразу, а превращается в надгробие, то есть пометку “удалено, время такое-то”. Без неё второе устройство никогда не узнает об удалении и вернёт запись обратно при следующей синхронизации.
Но надгробия нельзя копить вечно: они занимают место на сервере и у всех пользователей сразу. Разумный компромисс состоит в том, чтобы хранить их около месяца, а затем физически чистить. Устройство, которое не выходило на связь дольше, при подключении делает полную сверку списков вместо инкрементальной.
Как это выглядит в KIPRI
Каждая запись сохраняется в локальную базу устройства мгновенно и попадает в очередь синхронизации. Фоновый планировщик следит за сетью и состоянием приложения и отправляет очередь, когда это возможно. Конфликты решаются по версиям, а не по времени прихода. Приложение работает и вовсе без аккаунта, тогда данные просто остаются на устройстве.
Проверить всё это можно тем же способом: включите авиарежим и попробуйте пожить день. Разницы вы не заметите, в этом и смысл.
Статья помогла?
Спасибо, это лучший ответ. Раз помогло, может пригодиться и кому-то ещё.
Спасибо, что сказали. Напишите, чего не хватило, и статью дополним: [email protected]
