Я заинтересован в разработке библиотеки, которая будет синхронизировать базовую модель данных между устройствами через мобильный сервер Parse. Я хочу отразить функциональность, которую пытается обеспечить синхронизация основных данных iCloud.
Почему бы не использовать iCloud или ансамбли? В настоящее время я использую синхронизацию основных данных iCloud в производственном приложении, и это у меня не работает. Я также хочу обеспечить аутентификацию независимо от Apple ID, что является еще одной причиной, по которой я хочу уйти от iCloud. Что касается Ensembles, я не уверен, что это все еще будет работать с Dropbox из-за устаревание API синхронизации Dropbox.
Я не начал разрабатывать библиотеку. Я ищу отзывы о моем плане, который изложен ниже. Этот дизайн основан на этом ответе SO.
Общий план библиотеки:
Библиотека будет предоставлять стандартный базовый стек данных, который установит координатора постоянного хранилища и контекст управляемого объекта. Все стандартные основные операции CRUD с данными будут выполняться через интерфейс, предоставляемый библиотекой.
Каждый раз, когда выполняется операция CUD, объект операции синхронизации будет сохраняться в Parse в фоновом режиме, включая всю информацию, необходимую для воспроизведения операции. Это включает в себя: тип выполненной операции, уникальный идентификатор объекта, над которым была произведена операция, а в случае операции создания будут предоставлены родительский объект и связь.
- Каждая операция будет иметь связанный с ней номер change_id. Каждый раз, когда устройство загружает и выполняет операцию, оно сохраняет последний change_id, связанный с этой операцией.
- Перед загрузкой каждой операции синхронизации устройство отправляет запрос на сервер, чтобы убедиться, что сохраненный номер change_id соответствует номеру, хранящемуся локально. Если change_id на сервере выше, он сначала загрузит все операции синхронизации и выполнит их, а затем загрузит свои собственные операции синхронизации.
- Конфликты (два устройства, редактирующие одно и то же значение в автономном режиме) будут разрешаться путем определения того, какое устройство изменило значение последним.
Я что-то пропустил здесь? Какие потенциальные подводные камни могут быть при таком подходе? Я слышал, что синхронизация сложна, следует ли оставить это дело самым опытным разработчикам?