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