Я працюю над методом синхронізації основних даних, що зберігаються в додатку 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). Потім, коли пристрій підштовхує набір змін, він передаватиметься по ідентифікатору пристрою та по об'єктуId від об'єкта основних даних у локальному сховищі даних. Тоді мій хмарний сервер перевірить, чи не відповідає objectId та Id пристрою в таблиці AllObjects, і знайде запис, який слід змінити в початковій таблиці.
- Усі зміни мають бути відмічені часом, щоб їх можна було об'єднати.
- Пристрій повинен опитувати сервер, не використовуючи занадто багато акумулятора.
- Місцевим пристроям також потрібно буде оновити все, що зберігається в пам'яті, якщо / коли зміни надійдуть від сервера.
Чи ще чогось мені тут не вистачає? На які типи рамок слід звернути увагу, щоб зробити це можливим?