Я пишу приложение для iPad iPad, которое основано на CoreData. В моем приложении у меня есть экран для редактирования рецептом с 2-х типов информации:Сбой основных данных (EXC_BAD_ACCESS) при синхронизации контекстов в mergeChangesFromContextDidSaveNotification
- списки категории рецепта \ подкатегории и страны
- Вся другая информация рецепта, связанные с
Каждый из этого списка может быть отредактирован в popover. Изменения этого списка должны быть немедленно сохранены (т. Е. Если пользователь добавит некоторую категорию рецептов в список возможных категорий, но отменяет создание рецепта, эта категория должна быть доступна для всех рецептов). Было descided реализовать 2 отдельного NSManagedObjectContexts для обработки каждого вида информации: основного контекста для управления рецептами и поддерживающего контекст для списков.
Все операции с основными данными, выполняемые посредством MagicalRecord рамки. Оба контекста имеют контекст MagicalRecord по умолчанию как родительский. Каждый контекст наблюдает за изменениями в другом. Все контексты создаются и используются в основном файле , поэтому кажется, что эта проблема не имеет ничего общего с проблемами многопоточности.
Когда я пытаюсь создать объект в контексте поддержки и сохраняю изменения в контексте поддержки сразу после создания объекта, все идет ОК. Проблема возникает, когда вновь созданный объект удаляется сразу после создания - полученное EXC_BAD_ACCES. Однако объект сохраняется правильно и при следующем запуске его можно использовать и удалять без проблем синхронизации.
1 примечание: когда объект обращается от Основной контекст by existingObjectWithID: метод NSManagedObjectContext становится возможным удалить этот объект. Однако авария происходит в основном контексте (родительский контекст как основного, так и вспомогательного контекстов).
Вот мой код:
Entity создания:
RecipeCategory* category = [RecipeCategory MR_createInContext:_supportingContext];
category.name = itemName;
[_supportingContext MR_saveToPersistentStoreAndWait];
Entity удаление:
[(RecipeCategory*)itemToRemove MR_deleteEntity];
[_supportingContext MR_saveToPersistentStoreAndWait];
контекстов создание и наблюдение установка:
[_mainContext MR_stopObservingContext:_supportingContext];
[_supportingContext MR_stopObservingContext:_mainContext];
_mainContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
_supportingContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
[_mainContext MR_observeContextOnMainThread:_supportingContext];
[_supportingContext MR_observeContextOnMainThread:_mainContext];
Пожалуйста, советы, что может Кау сей вопрос, потому что теперь я смущен даже в каком направлении я буду двигаться, чтобы решить эту проблему. Раздел управления изменениями в документации Core Data ничего не дает. Те же результаты дали google.
С уважением, Илья.
Я удалил круговое наблюдение за контекстами. Теперь только основные часы для изменений в поддержке. Но это не помогло, аварии все еще представлены. BTW Я нашел некоторое обходное решение этой проблемы: если для обоих моих контекстов (основной и поддержки) я устанавливаю родительский объект как MR_rootSavingContext, все начинает работать нормально. Однако, похоже, для меня не будет solutiin, потому что поддержка iCloud также необходима, и MR_defaultContext отвечает за это. –
также вы указали на правила вложенных контекстов и способы обмена данными друг с другом - можете ли вы указать на некоторые статьи? Поиск в google в основном дает мне статьи, связанные с проблемами многопоточности Core Data. –
Лучшая документация, к сожалению, на данный момент - это видео WWDC по основным данным. Вы должны иметь возможность проверить их с помощью базовой учетной записи разработчика Apple. Я бы также избегал поддержки iCloud с основными данными ... это довольно плохо в их точке ... – casademora