iCloud + CoreData - как избежать дублирования предварительно заполненных данных?

У меня проблема с приложением «обувная коробка» для iCloud, и я надеюсь, что кто-нибудь мне поможет (я потратил много часов на борьбу с ним)

Приложение: - Простое приложение в стиле библиотеки, содержащее набор категорий (Cat1 .. CatN), каждая из которых содержит элементы (Item1 ... ItemM). Я использовал Apple iPhoneCoreDataRecipes для настройки стека iCloud CoreData.

С iCloud все работает почти идеально, за исключением того, что должно быть несколько предварительно заполненных пустых категорий, которые пользователь может начать использовать, как только он впервые откроет приложение (он также может быть отключен в это время). А вот и дьявол.

Вот что я делаю - как только мой persistentStoreCoordinator настроен, я отправляю уведомление

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter]
        postNotificationName: @"RefetchAllDatabaseData"
                      object: self
                    userInfo: nil];
    });

который получен моим MasterViewController. Когда уведомление получено, MasterViewController проверяет количество категорий в хранилище. Если количество доступных категорийравно 0 - предварительно заполненные категории вставляются.

К вашему сведению - я используюNSMergeByPropertyObjectTrumpMergePolicy для моего ManagedObjectContext

Проблема: Это хорошо работает для 1-го устройства. Но для 2-го устройства категории по умолчанию от iCloudдовольно часто полученный позже, чем был настроен persistentStoreCoordinator (и категории по умолчанию вставлены вторым устройством). В итоге у меня есть 2 набора категорий с одинаковыми именами на обоих устройствах.

Есть идеи, как это можно решить?

Испытанные решения: Я попробовал 2 стратегии, чтобы решить эту проблему. Оба начинаются одинаково. После того как я позвоню

[moc mergeChangesFromContextDidSaveNotification: note];

Я звоню

[self materializeKeysWithUserInfo: note.userInfo forContext: moc];

большое спасибо Хосе Инесу Канту Аррамбиде изhttps://devforums.apple.com/thread/126670?start=400&tstart=0 для его ссылочного кода - по существу

materializeKeysWithUserInfo:forContext:

получить managedObjectIds из note.userInfo и получить соответствующие объекты из ManagedObjectContext, поместив их в словарь.

Стратегия 1:

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

Эта стратегия эффективно удаляет дубликаты на обоих устройствах даже до того, как они появятся в пользовательском интерфейсе.НО

1) предметы с 1-го устройства теряются на 2-м устройстве - когда они попадают на 2-е устройство, их родительская категория отсутствует и их поле категории равно нулю, поэтому я не знаю, где их разместить.

2) через некоторое время предметы, потерянные на втором устройстве, также теряются на первом из-за конфликтов.

3) некоторые предметы со 2-го устройства также теряются из-за конфликтов.

Я пытался отдать предпочтение старшим категориям, а не новым.

Стратегия 2:

Все мои категории имеют метки времени создания.Все категории имеютустарелый логическое поле установлено вНЕТ на созданиеПри вставке из iCloud, получить пары категорий с одинаковым именем, если таковые имеютсяВыберите старые повторяющиеся категориипереместить свои предметы в новые двойные категориипометить старые категорииустарел = ДА

Эти стратегиипочти всегда удаляет дубликаты на обоих устройствах еще до их появления в пользовательском интерфейсеНО

большинство (или все) предметов с обоих устройств теряются из-за множества конфликтов по категориям и предметам.

Некоторые заключительные мысли:

Похоже, что эта стратегия не работает, так как мы начинаем одновременную смену контента на обоих устройствах, тогда как iCloud не подходит для такого шаблона.

В моих тестах оба устройства работали одновременно. Я не могу игнорировать случай, когда счастливый пользователь, который только что купил свой 2-й iDevice, устанавливает мое приложение на 2-е устройство (при котором приложение запускается на 1-м устройстве) и теряет все свои элементы в считанные минуты.

Есть идеи, как можно решить эту ситуацию? Как вы думаете, iCloud + CoreData готова к производству?

Стратегия 3

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

iCloud не знает о данных, которые существуют в базе данных до установки iCloud - мое второе устройство получает элементы, вставленные на первое устройство в предварительно заполненные категории, с категорией = ноль.

Элементы в дополнительных категориях (а также сами категории), вставленные в хранилище после настройки iCloud, синхронизируются должным образом.

Ответы на вопрос(1)

Ваш ответ на вопрос