Обновлять и удалять сущности в двух разных процессах - PullRequest
1 голос
/ 02 августа 2010


Я работаю над приложением для iPad, которое использует coredata. Он загружает информацию в базу данных, которая находится в сети, и записывает их в coredata. Приложение основано на разделенном представлении. Моя проблема заключалась в том, чтобы обновить данные в фоновом режиме.
Вот как я это сделал:
- Я создал NSOperation, который выполняет загрузку и обновление данных.
- Эта NSOperation использует другой NSManagedObjectContext, чем контекст appDelegate, возвращаемый этой функцией, который находится в appDelegate:

(NSManagedObjectContext*)newContextToMainStore {
     NSPersistentStoreCoordinator *coord = nil;
     coord = [self persistentStoreCoordinator];
     NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; 
     [moc setPersistentStoreCoordinator:coord]; 
     return [moc autorelease];
}

- У меня был наблюдатель в NSOperation, который будет вызывать эту функцию в appDelegate при сохранении контекста, чтобы также изменить контекст делегата:

- (void)mergeChangesFromContextSaveNotification:(NSNotification*)notification {
     [[self managedObjectContext]mergeChangesFromContextDidSaveNotification:notification];
}

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

Мое решение состояло в том, чтобы просто остановить процесс обновления, когда я удаляю права, а затем перезапустить его, просто ...
Но я понял, что изменения, внесенные в "основной" контекст, не применяются в новом контексте Я просто создаю для обновления.

Поэтому я спрашиваю вас: почему изменения не применяются в новом контексте? Если это неправильно, как ты это делаешь? Используя mergeChangesFromContext или что-то еще?
Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

Вам не нужно заботиться о том, что кто-то что-то удалит из интерфейса, bcs NSArrayController является поточно-ориентированным.Но если вы делаете обновления и удаляете одновременно, вы должны позаботиться об этом.

0 голосов
/ 04 августа 2010

Извините, мои ошибки:
- Во-первых, мои сущности содержали другие сущности, и из-за плохих отношений сущности, содержащиеся в родительском праве, не были удалены.
- Во-вторых, я думал, что вызов -cancelAllOperations остановит текущую операцию, но это не так, вы должны проверить в nsoperation, если процесс отменен с помощью [self isCancelled].
Вот и все!

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