Я посреди мозговой атаки облачного синхронизирующего решения для Базового приложения Данных, которое я в настоящее время разрабатываю. Я планирую на открытый исходный код код для этого однажды ее сделанный, чтобы любой использовал с их Базовыми приложениями Данных, таким образом введенными от сообщества о том, как эта система должна работать, очень ценится :-) Вот то, что я думаю:
Поставщик услуг по хранению данных
Как со всеми облачными синхронизирующими системами, устройство хранения данных является главной частью загадки. Существует много способов обработать это. Я мог настроить свой собственный сервер для устройства хранения данных или использовать сервис как Amazon S3, но потому что я начинаю с капиталом за 0$, в данный момент, заплаченным решением для устройства хранения данных не является жизнеспособный вариант. После некоторого размышления я решил обосноваться с Dropbox (уже хорошо установленное облачное синхронизирующее приложение и поставщик услуг по хранению данных). Профессионалы использования Dropbox:
В случае, если я решаю переключиться на другого поставщика услуг по хранению данных в будущем, я намереваюсь добавить "сервисы" к этой облачной синхронизирующей платформе, в основном позволяя любому создать класс обслуживания для взаимодействия через интерфейс с их выбором поставщика услуг по хранению данных, который может затем просто быть включен в платформу.
Структура устройства хранения данных
Это - действительно трудная часть для выяснения, таким образом, я должен так очень ввести, как я могу здесь. Я думал о структуре как это:
CloudSyncFramework
======> [app name]
==========> devices
=============> (device id)
================> deviceinfo
================> changeset
==========> entities
=============> (entity name)
================> (object id)
Быстрое объяснение этой структуры:
[[UIDevice currentDevice] uniqueIdentifier]
(на iOS) или порядковый номер (на Mac OS).NSKeyedArchiver
.Одновременная синхронизация
Это - одна из областей, где я почти абсолютно невежествен. Как я обработал бы 2 соединения устройств и синхронизацию с облаком одновременно? Кажется, существует высокий риск вещей, выходящих из синхронизации здесь или даже повреждения данных.
Обработка миграций
Еще раз, другая невежественная область здесь. Как я обработал бы миграции Базовой модели управляемого объекта Данных? Самая легкая вещь сделать здесь, кажется, только для стирания облачного хранилища данных, чистят и загружают новую копию данных из устройства, которое подверглось процессу миграции, но это кажется несколько опасным, и может быть лучший путь.
Преобразование NSManagedObjects в JSON
Преобразование атрибутов в JSON не является очень трудной задачей (тройки много кода для него плавающий вокруг сети). Отношения являются ключевой проблемой здесь. В этом сообщении stackoverflow Marcus Zarra отправляет код, в котором сами объекты связей добавляются к словарю JSON. Однако он упоминает, что это может вызвать бесконечный цикл в зависимости от структуры модели, и я не уверен, работало ли это с моим методом, потому что я храню каждый объект как отдельный файл.
Я пытался найти способ получить идентификатор как строку для NSManagedObject
. Затем я мог сохранить отношения в JSON как массив идентификаторов. Самая близкая вещь, которую я нашел, была [[managedObject objectID] URIRepresentation]
, но это не действительно идентификатор для объекта, его больше местоположения для объекта в персистентном хранилище, и я не знаю если его достаточно бетон использовать в качестве ссылки для объекта.
Я предполагаю, что мог генерировать строку UUID для каждого объекта и сохранить его как атрибут, но я открыт для предложений.
Синхронизация изменений в облаке
Первое (и все еще лучше всего) решение, которое появилось в мою голову для этого, должно было прислушаться NSManagedObjectContextObjectsDidChangeNotification
для получения списка измененных объектов затем обновите/удалите/вставьте те объекты в облачном хранилище данных. После того, как изменения были сохранены, я должен буду обновить changeset файл для любого зарегистрированного устройства для отражения недавно измененных объектов.
Одна проблема, которая подходит здесь, как я обработал бы неудавшуюся или прерванную синхронизацию?. Одна идея, которую я имею, состоит в том, чтобы сначала продвинуть изменения во временном каталоге на облаке, затем после того как это было подтверждено как успешное, для слияния его с основными данными на облаке так, чтобы прерывание посреди синхронизации не повреждало данные. Затем я сохранил бы записи объектов, которые должны быть обновлены в облаке в plist файл или что-то, чтобы быть продвинутыми в течение следующего раза, когда приложение подключено к Интернету.
Получение измененных объектов
Это довольно просто, устройство загружает свой changeset файл, выясняет, какие объекты должны быть обновлены/вставлены/удалены, затем действуют соответственно.
И это подводит итог моих мыслей для логики, что эта система будет использовать :-) Любое понимание, предложения, решения проблем, и т.д. значительно ценится.
После большого количества взглядов и чтения предложений TechZens, я придумал некоторые модификации к своему понятию.
Самое большое изменение, которое я продумал, состоит в том, чтобы заставить каждое устройство иметь отдельное хранилище данных в облаке. В основном каждый раз контекст управляемого объекта сохраняет (благодарит TechZen), он загрузит изменения в хранилище данных того устройства. После того, как те изменения обновляются, это создаст "changeset" файл с деталями изменения и сохранит его в changeset папки ДРУГИХ устройств, которые используют приложение. Когда другие устройства соединятся с синхронизацией, они пройдут changeset папку и применят каждый changeset к локальному хранилищу данных, затем обновят их соответствующие хранилища данных в облаке также.
Теперь, если новое устройство будет зарегистрировано в учетной записи, то оно найдет новейшую копию данных из всех устройств и загрузки этим для использования в качестве ее локального устройства хранения данных. Это решает проблему одновременной синхронизации и уменьшает возможности для повреждения данных, потому что нет никакого "центрального" хранилища данных, каждый, какие устройства касаются только его данных и просто обновляют изменения, а не каждый доступ устройства и изменение тех же данных одновременно.
Существуют некоторые очевидные конфликтные ситуации для контакта с, главным образом относительно удаления объектов. Если changeset загружает то, чтобы давать команду приложению удалить объект, который в настоящее время редактируется, и т.д. должны быть способы иметь дело с этим.
Вы хотите взглянуть на этот пессимистический взгляд на облачную синхронизацию: Почему облачная синхронизация никогда не будет работать. Он охватывает множество проблем, с которыми вы боретесь. Многие из них в значительной степени трудноразрешимы.
Очень, очень и очень сложно синхронизировать информационный период. Добавление различных устройств, различных операционных систем, различных структур данных и т. Д. Увеличивает сложность, зачастую фатально. Люди работали над вариантами этой проблемы с 70-х годов, и ситуация действительно не улучшилась.
Основная проблема заключается в том, что если вы оставите систему гибкой и настраиваемой, то сложность синхронизации всех вариантов резко возрастет в зависимости от количества настроек. Если вы сделаете его жестким, вы можете синхронизировать, но вы ограничены в том, что вы можете синхронизировать.
Как мне обращаться с 2 устройствами? подключение и синхронизация с облаком в то же время?
Если вы это поймете, вы станете богатым. Это большая проблема для нынешних поставщиков облачной синхронизации. Настоящая проблема здесь в том, что вы не «синхронизируете» свое слияние. Программное обеспечение - отстой при слиянии, потому что очень сложно установить предопределенный набор правил для описания всех возможных слияний.
Простейшая система - установить каноническое устройство или иерархию устройств, чтобы система всегда знала, какой вход выбрать. Однако это разрушает гибкость.
Как мне справиться с миграцией Модель управляемого объекта Core Data?
Миграция модели Core Data в значительной степени не имеет отношения к серверу. Это то, чем Core Data управляет внутри себя. Перенос модели обновляет модель, то есть граф сущностей, а не фактические данные.
Преобразование NSManagedObjects в JSON
Моделирование отношений сложно, особенно с инструментами, которые не поддерживают его так легко, как Core Data. Однако предполагается, что URI постоянного идентификатора управляемого объекта будет служить в качестве UUID, который привязывает объект к определенному месту в определенном хранилище на определенном устройстве. Технически не гарантируется, что он универсально уникален, но достаточно близок для всех практических целей.
Синхронизация изменений с облаком
Я думаю, вы путаете детали реализации Core Data с самим облаком. Если вы используете NSManagedObjectContextObjectsDidChangeNotification
, вы будете вызывать сетевой трафик каждый раз при изменении наблюдаемого контекста, независимо от того, сохраняются эти изменения или нет. В зависимости от приложения это может приводить к тысячам подключений за несколько минут. Вместо этого вы хотите синхронизировать только тогда, когда контекст максимально сохранен.
Здесь возникает одна проблема: как справлюсь ли я с неудачным или прерванным sync?
Вы не фиксируете изменения до завершения синхронизации. Это большая проблема, которая приводит к повреждению данных. Опять же, вы можете обладать гибкостью, сложностью и хрупкостью или негибкостью, простотой и надежностью.
Получение измененных объектов: Это довольно просто, устройство загружает его файл набора изменений, выясняет, какие объекты должны быть обновлен / вставлен / удален, затем действует соответственно
Это просто, если у вас негибкая структура данных. Описание изменений гибкой структуры данных - кошмар.
Не уверен, что я помог кому-нибудь. Ни у одной из проблем нет изящных решений. Большинство дизайнеров заканчивают тем, что прибегают к жесткости и / или медленному итеративному слиянию методом грубой силы.