Несколько слоев MOC сливается ... CoreData ветеранов, что вы думаете? - PullRequest
0 голосов
/ 11 августа 2010

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

Оригинальный пост:

Я использую метод сохранения MOC, используемый в Apple CoreDataBooks . Однако мне кажется, что я использую два уровня слияния MOC (три MOC, где 3-й сливается с 2-м, а затем 2-й сливается с 1-м).

Во-первых, у меня есть таблица (ClassList), в которой перечислены школьные занятия. Выбор класса выдвигает 2-рядное табличное представление (AddClass). В AddClass первая строка позволяет пользователю редактировать заголовок класса. При выборе второй строки отображается табличное представление (ClassRoster), в котором отображается список учеников для этого класса. И, наконец, выбор ученика помещается в другой двухстрочный просмотр таблицы (AddStudent), где пользователь может редактировать имя ученика и имя пользователя.

Я могу успешно добавлять и сохранять классы с помощью метода слияния с двумя MOC (managedObjectContext и добавление ManagedObjectContext, используемого CoreDataBooks). Я назову «базовый MOC» в моем первом представлении «MOC1» и назову «блокнот» MOC «MOC2».

MOC2 временно сохраняет изменения, внесенные в объект класса. Затем эти изменения можно сохранить или отменить, отправив делегату -didFinishWithSave:(BOOL). Если я сохраню изменения, сделанные в MOC2, объединятся с MOC1. Это слияние работает отлично.

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

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

UPDATE:

г. Zarra рекомендовал использовать initWithEntity:insertIntoManagedObjectContext: и установить MOC равным nil, создав тем самым временный объект, который впоследствии мог бы установить и сохранить MOC.

Следуя его совету, я пытаюсь ввести следующий код:

    NSManagedObjectModel *managedObjectModel - [[managedObjectContext persistentStoreCoordinator] managedObjectModel];
    NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"MyClass"];
    MyClass *newClass = [[MyClass alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];

Я столкнулся с ошибкой, но пока не уверен, что она связана с этим кодом. Я буду отлаживать и публиковать то, что я нахожу.

1 Ответ

1 голос
/ 11 августа 2010

Да.Вам не нужно использовать более одного NSManagedObjectContext.Этот пример очень плохой.В вашем случае вы должны использовать один контекст, и это устранит все ваши проблемы.

Если вы хотите временную сущность, создайте ее с nil NSManagedObjectContext.Когда вы хотите сохранить его, вы вызываете -setManagedObjectContext:, а затем сохраняете это NSManagedObjectContext.

Единственный раз, когда вы реально хотите использовать более одного NSManagedObjectContext, это когда вы находитесь в многопоточной ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...