CoreData и iCloud

Я разрабатываю основное приложение для работы с данными и подумывал о добавлении поддержки iCloud, но, просмотрев информацию в Интернете, я часто слышал, что iCloud+CoreData ненадежны и часто ломаются.

Это правда? В книге, посвященной основным данным, которую я читаю, упоминается, что iCloud+CoreData был ненадежен в iOS 5, но с тех пор был исправлен, однако я также слышал обратное, что iCloud+CoreData по-прежнему ненадежен в iOS 6. Если это так, то хранение база данных в пользовательском формате поможет вообще?


person john smith    schedule 12.06.2013    source источник
comment
У многих разработчиков по-прежнему возникают проблемы с синхронизацией Core Data iCloud даже в iOS 6: см. эту статью, чтобы узнать последние точки зрения. Возможно, в iOS 7 ситуация улучшилась: она все еще находится под соглашением о неразглашении, поэтому пока никто не делится своим опытом.   -  person Amy Worrall    schedule 12.06.2013
comment
@Amy Что меня смущает, так это то, что некоторые люди говорят, что это работает, а некоторые говорят, что это не так, конечно, если есть структурные проблемы с iCloud + CoreData, их последствия будут универсальными. Кстати, в связанной статье упоминается TICoreDataSync. Был ли у вас опыт работы с этой структурой?   -  person john smith    schedule 12.06.2013
comment
Я только что опубликовал пример приложения Core Data в стиле библиотеки iOS, которое включает интеграцию с iCloud. Приложение включает в себя пакет настроек, позволяющий пользователю переключать настройки «Использовать настройки iCloud» и переносить магазин в iCloud и из него в зависимости от настроек пользователя. Загрузите по ссылке ниже - извините за документацию - в какой-то момент это обойдется, но это работает почти так же, как пример UIManagedDocument. ossh.com.au/design-and-technology/software-development   -  person Duncan Groenewald    schedule 14.01.2014


Ответы (3)


Теперь, когда вышла iOS 7, мы можем поговорить об этом. И все вроде бы указывало на то, что в iOS 7 пофиксили синхронизацию iCloud Core Data. Я собираюсь добавить синхронизацию iCloud Core Data в приложение (только для iOS 7), которое я создаю, поэтому я пока не могу говорить о личном опыте, но все, что я слышал, говорит о том, что теперь это хорошо для прайм-тайма.

Я настоятельно рекомендую посмотреть видеозапись сессии «Что нового в Core Data и iCloud» с конференции WWDC 2013: https://developer.apple.com/videos/wwdc/2013/?id=207 (требуется членство в программе разработчиков Apple). Я смотрел его уже дважды, и они, безусловно, сделали все намного проще.

Наконец, я рекомендую взглянуть на UbiquityStoreManager на GitHub. Это библиотека, которая в значительной степени делает все болезненные части iCloud Core Data за вас. Он был изменен, чтобы учесть значительные улучшения в iOS 7, хотя, если вы хотите воспользоваться ими, ваше приложение должно быть только для iOS 7 (это применимо независимо от того, используете ли вы библиотеку или нет).

ОБНОВЛЕНИЕ: после публикации этого ответа я теперь могу говорить на основе личного опыта и могу подтвердить, что Core Data iCloud Sync в iOS 7 надежна и, более того, невероятно проста. реализовать. Я добавил его в свое приложение без использования UbiquityStoreManager или любой другой сторонней библиотеки, и это было очень просто. Буквально несколько строк кода.

EDIT: я создал репозиторий GitHub со своим стеком iCloud Core Data для iOS 7. Надеюсь, это поможет: https://github.com/mluisbrown/iCloudCoreDataStack

person mluisbrown    schedule 27.09.2013
comment
Можете рассказать о личном опыте за это время? - person Bright Lee; 23.10.2013
comment
@mluisbrown Готов к работе в кратчайшие сроки. Большое спасибо! Суть была проста в реализации, но почему внешнему хранилищу требуется так много времени, чтобы сработать после переустановки? Есть ли способ исправить это? - person AlexanderN; 31.10.2013
comment
@AlexanderLongbeach понятия не имею, но я думаю, что это просто время, необходимое для доступа к серверам iCloud. Вы ничего не можете с этим поделать, AFAIK. Я заметил, что на симуляторе вам в значительной степени приходится принудительно синхронизировать вручную (⇧⌘I), иначе это займет вечность. Никаких проблем на устройстве. - person mluisbrown; 31.10.2013
comment
Это просто интегрировано? Должно быть больше настроек. Должен! - person erdekhayser; 20.11.2013
comment
@foriinrangeawesome да, это действительно так просто :-) - person mluisbrown; 20.11.2013
comment
@mluisbrown У меня только один вопрос. Знаете ли вы, почему в этом случае я получаю сообщение об ошибке entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name? Я изменил методы для storeURL и modelURL, поэтому не уверен, почему это происходит. - person erdekhayser; 20.11.2013
comment
@foriinrangeawesome, эта ошибка означает, что ваш NSManagedObjectContext равен нулю. Либо он никогда не инициализировался, либо вы где-то установили его на ноль. См. ответы на этот вопрос: stackoverflow.com/q/11596487/368085. Маловероятно, что это связано с iCloud. - person mluisbrown; 20.11.2013
comment
@mluisbrown Я вижу, что не так. Мое приложение теперь должно использовать файлы SQLite, возможно, из-за разницы между вашей реализацией основных данных и моей. Лучше посмотреть на это раньше, чем позже. - person erdekhayser; 20.11.2013
comment
@mluisbrown Знаете ли вы, как перенести существующий стек не из iCloud в iCould? - person X.Y.; 26.11.2013
comment
@фантомлимб Да. По сути, вы просто используете migratePersistentStore:toURL:options:withType:error: и указываете значение NSPersistentStoreUbiquitousContentNameKey в параметре options. Если вам нужна дополнительная информация, лучше свяжитесь со мной по электронной почте, а не используйте эти комментарии. - person mluisbrown; 26.11.2013
comment
@mluisbrown Спасибо! Я попробую это, и, возможно, снова побеспокою вас по электронной почте! - person X.Y.; 27.11.2013
comment
@mluisbrown Иногда после запуска migratePersistentStore:toURL:options:withType:error: вся моя модель дублируется. Похоже, что иногда iCloud автоматически переносит его для меня. У вас есть идеи, почему? - person Abras; 29.11.2013
comment
@Abras migratePersistentStore:toURL:options:withType:error: перенесет все данные из одного хранилища в другое. Он не выполняет обнаружение дубликатов, это зависит от вас. Таким образом, если вы перенесете свой локальный магазин в iCloud, а затем вернетесь обратно, все ваши записи будут дублироваться. OTOH Я часто видел, как iCloud автоматически переносит данные из локального хранилища, вообще не вызывая migrate.... Это ошибка. - person mluisbrown; 29.11.2013
comment
@mluisbrown Я думаю, что Apple хотела, чтобы это было автоматически. Ошибка в том, что это происходит не постоянно. Я знаю, что должен обнаруживать и удалять дубликаты, но нет никакого способа узнать, когда iCloud автоматически перенесет их. Таким образом, нет никакого способа определить, когда появляются дубликаты. Мой единственный вариант - проверять каждый новый запуск, но это все равно оставит пользователя с дублированными записями на некоторое время. Нельзя сказать, что в большинстве случаев после миграции iCloud начинает выдавать множество разных ошибок. - person Abras; 29.11.2013
comment
@Abras @mluisbrown При внедрении этого стека в мое существовавшее ранее приложение мне пришлось пропустить migrate..., потому что это произошло автоматически и создало дубликаты объектов. В этом смысле это очень удобно, и у меня не было проблем с этим (когда я впервые реализовал этот стек, я написал много кода, чтобы попытаться выполнить миграцию вручную, но обнаружил, что мне это не нужно. Было бы лучше узнайте, пока не был написан посторонний код!) - person erdekhayser; 31.01.2014
comment
Спасибо, что поделились своим PersistentStack! Я использовал его, но некоторые пользователи сообщают о потерянных данных после обновления приложения. Есть идеи? - person hyouuu; 04.03.2014
comment
@hyouuu нет причин, по которым обновление приложения должно вызывать потерю данных. Однако, если приложение удалено и переустановлено, может потребоваться некоторое время (несколько минут), чтобы приложение синхронизировало свои данные с iCloud, и может создаться впечатление, что данные исчезли. Это не связано с PersistentStack, просто iCloud работает медленно. - person mluisbrown; 05.03.2014
comment
Спасибо за быстрый ответ @mluisbrown! К сожалению, пользователь, сообщивший о пропаже, похоже, не удалил приложение; другое наблюдение заключается в том, что синхронизация между iPhone и iPad ненадежна, одно поведение заключается в том, что элементы, созданные на iPhone, будут отображаться на iPad, но не наоборот. Вы вообще сталкивались с подобными проблемами? - person hyouuu; 06.03.2014
comment
@hyouuu У меня были похожие проблемы, хотя, учитывая достаточное количество времени, все в конце концов синхронизируется. Это проблемы с самим iCloud, а не с кодом. Кстати, если вы хотите продолжить это, создайте вопрос на GitHub, это не подходящее место для этого :) - person mluisbrown; 06.03.2014
comment
Спасибо :) круто! Продолжайте обновлять этот репозиторий github. Любить это - person real 19; 17.04.2014
comment
Наконец-то основные данные и iCloud работают вместе! Отличная работа с GIT, лучший ответ во всей сети :-) - person DogCoffee; 27.05.2014
comment
Я получил версию Swift, основанную на iCloudCoreDataStack @mluisbrown, с некоторым сгенерированным кодом Xcode и технической поддержкой Apple, на github. com/hyouuu/iCloudCoreData-Swift Возможно, я допустил очевидные ошибки — помогите исправить это! - person hyouuu; 07.11.2014
comment
Мне просто интересно, как у всех был опыт? Пользователи моего приложения по-прежнему случайным образом теряют данные после обновления приложения или время от времени ничего не делают :( - person hyouuu; 20.03.2015
comment
Я понимаю, что поднимаю здесь очень мертвую дискуссию, но кто-нибудь видел проблемы с этим примером проекта github после выпуска ios9/swift2? У меня невероятные проблемы. - person Charlie; 29.10.2015
comment
Все еще не так радужно, как следует из ответа. Мы используем стек iCloud + Core Data с момента его появления, а также прошли все внутренние итерации Apple по улучшению стека. Хотя текущий стек действительно работает лучше старого, у нас все еще есть неустранимые проблемы, которые мы обнаружили во время бета-тестирования за последние пару недель (в основном это худший случай: потерянные пользовательские данные). - person Rafael Bugajewski; 20.01.2016
comment
привет @mluisbrown, вы знаете, есть ли другой способ написать общедоступную базу данных в качестве администратора, чтобы заполнять и поддерживать данные, не требуя входа в систему icloud? полный вопрос: stackoverflow.com/questions/36808601/ - person Crashalot; 23.04.2016

Ссылка на видео изменилась: https://developer.apple.com/videos/wwdc/2013/?id=207

Редактировать: Это должен быть комментарий к последнему ответу, но у меня нет требуемой репутации 50+ :(

person HeyMan    schedule 05.04.2014
comment
Спасибо. Я обновил ссылку в ответе и проголосовал за ваш ответ, чтобы помочь вам достичь 50+ представителей :) - person mluisbrown; 07.04.2014

В macOS 10.15 и iOS 13 Apple представила NSPersistentCloudKitContainer, который

Контейнер, который инкапсулирует стек Core Data в вашем приложении и отражает выбранные постоянные хранилища в частной базе данных CloudKit.

Ссылки:

Документация Apple: зеркалирование основного хранилища данных с помощью CloudKit

Пример кода Apple: синхронизация локального магазина с облаком

person vadian    schedule 23.01.2020