Я работал над методом синхронизации основных данных, хранящихся в приложении iPhone, между несколькими устройствами, такими как iPad или Mac. Существует не так много (если вообще есть) схем синхронизации для использования с Core Data в iOS. Однако я думал о следующей концепции:
- В локальное хранилище данных ядра происходит изменение, и изменение сохраняется. (a) Если устройство подключено к сети, оно пытается отправить набор изменений на сервер, включая идентификатор устройства, отправившего набор изменений. (b) Если набор изменений не доходит до сервера или если устройство не подключено к сети, приложение добавит набор изменений в очередь для отправки, когда он поступит онлайн.
- Сервер, сидящий в облаке, объединяет определенные наборы изменений, которые он получает с помощью своей основной базы данных.
- После того, как набор изменений (или очередь наборов изменений) объединен на сервере облака, сервер подталкивает все эти смены изменений к другим устройствам, зарегистрированным на сервере, используя какую-то систему опроса. (Я думал использовать сервисы Apple Push, но, судя по комментариям, это не работоспособная система.)
Есть ли что-нибудь, что мне нужно думать? Я рассмотрел структуры REST, такие как ObjectiveResource, Основной ресурс, и RestfulCoreData. Конечно, все они работают с Ruby on Rails, с которыми я не привязан, но это место для начала. Основные требования для моего решения:
- Любые изменения должны быть отправлены в фоновом режиме без приостановки основного потока.
- Он должен использовать как можно меньше полосы пропускания.
Я подумал о ряде проблем:
- Убедитесь, что идентификаторы объектов для разных хранилищ данных на разных устройствах подключены к серверу. Иными словами, у меня будет таблица идентификаторов объектов и идентификаторов устройств, привязанных по ссылке на объект, хранящийся в базе данных. У меня будет запись (DatabaseId [уникальная для этой таблицы], ObjectId [уникальная для элемента во всей базе данных], Datafield1, Datafield2), поле ObjectId будет ссылаться на другую таблицу: AllObjects: (ObjectId, DeviceId, DeviceObjectId). Затем, когда устройство подталкивает набор изменений, он будет проходить по идентификатору устройства и объектуId из основного объекта данных в локальном хранилище данных. Затем мой облачный сервер будет проверять идентификатор objectId и Device в таблице AllObjects и найти запись для изменения в исходной таблице.
- Все изменения должны быть временными, чтобы их можно было объединить.
- Устройство должно будет опросить сервер, не используя слишком много аккумулятора.
- Локальным устройствам также потребуется обновить все, что содержится в памяти, если/когда изменения получены с сервера.
Есть ли что-нибудь еще, что мне здесь не хватает? Какие рамки я должен рассмотреть, чтобы сделать это возможным?