2

Я пишу приложение для iPad iPad, которое основано на CoreData. В моем приложении у меня есть экран для редактирования рецептом с 2-х типов информации:Сбой основных данных (EXC_BAD_ACCESS) при синхронизации контекстов в mergeChangesFromContextDidSaveNotification

  1. списки категории рецепта \ подкатегории и страны
  2. Вся другая информация рецепта, связанные с

Каждый из этого списка может быть отредактирован в 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.

С уважением, Илья.

ответ

0

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

В вашем случае вы можете искать метод MR_confinementContext для NSMOC. Это создаст контекст, который использует старую модель ограничения содержания.Это может помочь вам обойти ваши потоки. Но во-первых, не делайте круговое наблюдение ... потоки данных в

+0

Я удалил круговое наблюдение за контекстами. Теперь только основные часы для изменений в поддержке. Но это не помогло, аварии все еще представлены. BTW Я нашел некоторое обходное решение этой проблемы: если для обоих моих контекстов (основной и поддержки) я устанавливаю родительский объект как MR_rootSavingContext, все начинает работать нормально. Однако, похоже, для меня не будет solutiin, потому что поддержка iCloud также необходима, и MR_defaultContext отвечает за это. –

+0

также вы указали на правила вложенных контекстов и способы обмена данными друг с другом - можете ли вы указать на некоторые статьи? Поиск в google в основном дает мне статьи, связанные с проблемами многопоточности Core Data. –

+0

Лучшая документация, к сожалению, на данный момент - это видео WWDC по основным данным. Вы должны иметь возможность проверить их с помощью базовой учетной записи разработчика Apple. Я бы также избегал поддержки iCloud с основными данными ... это довольно плохо в их точке ... – casademora