Как избежать назначения объектов CoreData в двух разных зонах записей CloudKit? ⇐ IOS
Как избежать назначения объектов CoreData в двух разных зонах записей CloudKit?
Я запустил приложение с CoreData, и все работало отлично. Затем я перешел на CloudKit, и все пошло не так. Последние несколько недель меня регулярно преследуют ошибки
ошибка: CoreData+CloudKit: -NSCloudKitMirroringDelegate _requestAbortedNotInitialized:: — никогда не инициализируется успешно и не может быть выполнено запрос ' A1AD2329-41F4-44F6-BEF6-452A62C7B2C0' из-за ошибки: Ошибка Domain=NSCocoaErrorDomain Code=134060 «Произошла ошибка основных данных». UserInfo={NSLocalizedFailureReason=Обнаружено повреждение графа объекта. Объекты, связанные с '0xb925efc0b75e6e2c x-coredata://7974B0E0-2A86-4F52-B0B3-72F8FAE3AFB1/ShotCoreData/p2447' назначены нескольким зонам: {( , )}}
У меня довольно сложная настройка CoreData, которая выглядит примерно так: Мастер
[*]Категория1 Ребенок 1 Ребенок2 Child3 (который будет содержать ссылку на идентификатор, строку UUID, на категорию2) [*]Категория2
Код для сохранения объектов из версии приложения в CoreData выглядит примерно так:
func saveObject(_ newObject: AppModel) { пусть newCoreObject = Категория1() newCoreObject.child1 = ConvertChild1 (из: newObject.child1Models) сохранитьКонтекст() } частная функция ConvertChild1 (из источника: [Child1AppModel]) -> [Child1] { источник.compactMap { пусть coreModel = Child1AppModel($0) coreModel.child2 = ConvertChild2 (из: source.child2Models) } } частная функция ConvertChild2 (из источника: [Child2AppModel]) -> [Child2] { // Создаем объект CoreData и присваиваем свойства, сопоставленные с версией AppModel } Мне кажется, что иногда при создании объектов Child2 или Child3 они назначаются нескольким зонам, как зоне по умолчанию, так и пользовательской зоне (после назначения категории 1), что приводит к повреждению графа CoreData и данные блокируются локально , удаленная синхронизация больше не выполняется.
Итак, у меня осталось два вопроса:
[*]Почему это происходит? Есть ли какой-то трюк, который мне не хватает, чтобы обеспечить размещение новых объектов только в правильной зоне? В настоящее время я полагаюсь на то, что CoreData "получит это", и не выполняю никаких ручных назначений для отдельных элементов. [*]Как безопасно перенести данные в случае такого повреждения? Должен ли я вручную проанализировать каждый тип объекта из зоны по умолчанию (com.apple.coredata.cloudkit.zone) и убедиться, что я удалю его отсюда, если он присутствует в пользовательской зоне? Или есть более общий вариант получения затронутых объектов и удаления клонов (например: получить элементы, находящиеся в ZoneA и ZoneB, а затем удалить их из ZoneB)?
Я запустил приложение с CoreData, и все работало отлично. Затем я перешел на CloudKit, и все пошло не так. Последние несколько недель меня регулярно преследуют ошибки
ошибка: CoreData+CloudKit: -NSCloudKitMirroringDelegate _requestAbortedNotInitialized:: — никогда не инициализируется успешно и не может быть выполнено запрос ' A1AD2329-41F4-44F6-BEF6-452A62C7B2C0' из-за ошибки: Ошибка Domain=NSCocoaErrorDomain Code=134060 «Произошла ошибка основных данных». UserInfo={NSLocalizedFailureReason=Обнаружено повреждение графа объекта. Объекты, связанные с '0xb925efc0b75e6e2c x-coredata://7974B0E0-2A86-4F52-B0B3-72F8FAE3AFB1/ShotCoreData/p2447' назначены нескольким зонам: {( , )}}
У меня довольно сложная настройка CoreData, которая выглядит примерно так: Мастер
[*]Категория1 Ребенок 1 Ребенок2 Child3 (который будет содержать ссылку на идентификатор, строку UUID, на категорию2) [*]Категория2
Код для сохранения объектов из версии приложения в CoreData выглядит примерно так:
func saveObject(_ newObject: AppModel) { пусть newCoreObject = Категория1() newCoreObject.child1 = ConvertChild1 (из: newObject.child1Models) сохранитьКонтекст() } частная функция ConvertChild1 (из источника: [Child1AppModel]) -> [Child1] { источник.compactMap { пусть coreModel = Child1AppModel($0) coreModel.child2 = ConvertChild2 (из: source.child2Models) } } частная функция ConvertChild2 (из источника: [Child2AppModel]) -> [Child2] { // Создаем объект CoreData и присваиваем свойства, сопоставленные с версией AppModel } Мне кажется, что иногда при создании объектов Child2 или Child3 они назначаются нескольким зонам, как зоне по умолчанию, так и пользовательской зоне (после назначения категории 1), что приводит к повреждению графа CoreData и данные блокируются локально , удаленная синхронизация больше не выполняется.
Итак, у меня осталось два вопроса:
[*]Почему это происходит? Есть ли какой-то трюк, который мне не хватает, чтобы обеспечить размещение новых объектов только в правильной зоне? В настоящее время я полагаюсь на то, что CoreData "получит это", и не выполняю никаких ручных назначений для отдельных элементов. [*]Как безопасно перенести данные в случае такого повреждения? Должен ли я вручную проанализировать каждый тип объекта из зоны по умолчанию (com.apple.coredata.cloudkit.zone) и убедиться, что я удалю его отсюда, если он присутствует в пользовательской зоне? Или есть более общий вариант получения затронутых объектов и удаления клонов (например: получить элементы, находящиеся в ZoneA и ZoneB, а затем удалить их из ZoneB)?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение