2014-11-08 5 views
3

Я реализовал приложение для iPhone, которое имеет около 50 тыс. Пользователей. Переход от iOS7 к iOS8 многим из этих пользователей испытал ужасное чувство, когда они думали, что данные теряются.iCloud + Core Data: первый импорт и пользовательское чувство потери данных

Я реализовал поведение первого-импорта, что я думал, был один предложенный Apple,

1) Пользователи запустить приложение

2) ICloud, автоматически, начинается синхронизация данные, ранее сохраненные на iCloud

3)В какой-то момент пользователь g и др уведомлено, что данные ICloud готов благодаря NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted

Проблемы с 3) В каком-то момент:
пользователей, которые должны синхронизировать много данным нужны минуты, чтобы получить синхронизации завершены, и в это время они считают, что их данные потеряны.

Я действительно не знаю, как сообщить моим пользователям, что им нужно подождать, чтобы увидеть, что их данные синхронизированы, потому что Не знаю, когда начнется эта операция.


Я думаю о возможном решении:

Во время первого запуска приложения, с просьбой к пользователю, если он хочет использовать ICloud. Если он захочет использовать его, создавая базу данных с параметрами iCloud, поэтому я точно знаю, что синхронизация начинается здесь (я полагаю ...) Я действительно не уверен, как реализовать это поведение, так как я всегда видел Основные данные в AppDelegate, но для достижения такого поведения я предполагаю, что мне нужно переместить все параметры CoreData в контроллере.

Что вы думаете об этом решении? как вы работаете над этой проблемой в ваших приложениях?

ответ

2

Ваша идея правильная, по крайней мере, это то, что мы делаем. Но оставьте это в appDelegate.

Проведите различие между iCloud и без iCloud при выполнении «addPersistentStoreWithType». Если вы сделаете это с помощью параметров iCloud, он начнет напрямую создавать локальный магазин, который является своего рода заполнителем (я уверен, что вы это знаете, но просто чтобы мои мысли были понятны). Как только это будет сделано, синхронизация начнется с iCloud. Итак, это отправная точка, которую я понял, что вы искали.

Этот процесс можно просмотреть с помощью уведомлений NSPersistentStoreCoordinatorStoresDidChangeNotification и сообщить пользователю, вызванному этим уведомлением.

Если вы посмотрите на «Реакция на события iCloud» в документах https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html#//apple_ref/doc/uid/TP40013491-CH3-SW5, вы найдете подробный desc.

+0

Правильное событие для просмотра - NSPersistentStoreCoordinatorStoresDidChangeNotification спасибо! – MatterGoal

+0

Я не принял ваш ответ, так как событие «willChange» вызывается, когда данные уже загружаются из iCloud :( – MatterGoal

2

Подводя итог, описание события, которое вы описываете, является частью процесса перехода учетной записи.Переход счета происходит, когда один из следующих четырех событий срабатывают:

  • Первоначального импорт
  • счет ICloud используется меняла
  • ICloud отключен данные
  • вашего приложения удаляются

Во время этого события Core Data опубликует уведомления NSPersistentStoreCoordinatorStoresWillChangeNotification и NSPersistentStoreCoordinatorStoresDidChangeNotification, чтобы вы знали, что происходит переход на учетную запись. Тип перехода, который нас интересует, - NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted.

Для получения информации, я переместил весь код, связанный с Core Data, на свой собственный менеджер для простоты и использовал его с шаблоном проектирования singleton. При настройке singleton я регистрирую Менеджер для всех соответствующих уведомлений (NSPersistentStoreDidImportUbiquitousContentChangesNotification, NSPersistentStoreCoordinatorStoresWillChangeNotification, NSPersistentStoreCoordinatorStoresDidChangeNotification, NSPersistentStoreCoordinatorWillRemoveStoreNotification). Я храню несколько данных в моих настройках (NSUserDefaults или что-то еще), как последнее состояние iCloud (включено, отключено, неизвестно), если начальный импорт выполнен или нет, и т. Д.

То, что я делаю, было с подсказкой (UIAlertController или что-нибудь еще), чтобы получить подтверждение, если пользователь хочет использовать iCloud или нет. У меня есть метод displayICloudDialogAndForce:completion:, чтобы сделать это, и делайте это только в том случае, если состояние состояния iCloud неизвестно или я использую параметр force.

Затем, после ввода данных пользователя, я называю setupCoreDataWithICloud: методом, логический параметр iCloud в зависимости от выбора пользователя. Затем я установил свой стек Core Data в облаке или нет в соответствии с параметром iCloud. Если я настраиваю iCloud, я бы проверял мои настройки на значение импортированного ключа iCloud (boolean). Если значение НЕТ, я представляю новый модальный, чтобы предупредить пользователя о входящем импорте, который может занять некоторое время.

Я зарегистрировал своего менеджера для разных уведомлений и специально NSPersistentStoreCoordinatorStoresDidChangeNotification. В моем обратном вызове storeDidChange: я проверяю тип перехода, и если он равен NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted, я меняю содержимое своего модального файла, чтобы показать пользователю, что импорт был успешным и удалив его через несколько секунд, сохраняя в моих настройках начальную импорт сделан.

- (void)storeDidChange:(NSNotification *)notification 
{ 
    NSPersistentStoreUbiquitousTransitionType transitionType = [notification.userInfo[NSPersistentStoreUbiquitousTransitionTypeKey] integerValue]; 

    if (transitionType == NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted) { 
     [settings setDefaults:@(YES) forKey:kSettingsICloudImportedKey]; 
     [ICloudModal dismissWithSuccess]; 

     // ... 
    } 

    // Do other relevant things... 
} 
+0

И что вы делаете при первом запуске, когда NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted не вызван? Вы представляете модальный при первом запуске ... но если у пользователя нет данных, хранящихся в iCloud, уведомление initialImportComplete никогда не вызывается, поэтому модально никогда не закрывается. – MatterGoal

+0

@MatterGoal - возможный способ справиться с этим, чтобы наблюдать контейнер ubiquity. Сначала выполните запрос. if iCloud (имеется папка/coredata), тогда у пользователя есть хранилища основных данных, сохраненные в их iCloud. Если нет папки/coredata, синхронизации не будет. Просто теория. – mattsven

Смежные вопросы