Coredata / MagicalRecord, сохранение и обновление пользовательского интерфейса в фоновом режиме

Я использую Coredata и MagicalRecord в проекте iOS, но не могу решить некоторые проблемы с сохранением. У меня есть один ManagedObjectContext, чтобы хранить мой объект в памяти и отображать некоторую информацию. Когда я хочу создать новую сущность, я создаю ее в фоновом контексте с помощью следующего метода:

__block B *b = [B MR_createInContext:[[DataBaseManager sharedManager] managedObjectContext]];
[a setB:b];
__block A *aInLocalContext;
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    B *bInLocalContext = (B *)[b MR_inContext:localContext];
    aInLocalContext = (A *)[a MR_inContext:localContext];
    [aInLocalContext setB: bInLocalContext];
} completion:^(BOOL success, NSError *error) {}];

b создается в моем контексте отображения, но bInLocalContext имеет значение nil в backgroundContext (то есть localContext), поэтому мои данные не сохраняются и связь не устанавливается. Правильный ли способ создать и сохранить новый NSManagedObjectContext в фоновом контексте и сохранить данные в контексте отображения для обновления пользовательского интерфейса?

заранее спасибо


person Antonin    schedule 21.07.2014    source источник


Ответы (1)


Я знаю, что это старый вопрос, но вы никогда не сохраняете контекст после создания b. Таким образом, когда вы звоните

[b MR_inContext:localContext],

он возвращает nil, потому что b никогда не сохранялся.

Что касается вашего вопроса о правильном способе сохранения и отображения, да, это будет работать, но, не зная, как вы настроили [[DataBaseManager sharedManager] managedObjectContext], вам необходимо убедиться, что он знает об изменениях, внесенных в других контекстах, либо путем обновления из постоянного хранилища, либо наблюдая NSManagedObjectContextDidSaveNotification.

Стоит упомянуть, что, поскольку вы используете MagicalRecord, вам, вероятно, следует просто использовать MR_defaultContext, так как это то, для чего он нужен!

person Aaron A.    schedule 22.09.2014