Удаление управляемых объектов в фоновом блоке - PullRequest
0 голосов
/ 17 августа 2010

На iPhone я пытался удалить управляемые объекты в фоновом режиме:

- (void) cleanUp {
    dispatch_queue_t queue_cleanUp;
    queue_cleanUp = dispatch_queue_create("com.aroundcal.cleanup", NULL);
     dispatch_async(queue_cleanUp, ^{
        while (!self.stopThread) {      
            [self deleteMyObjects]; 
            [NSThread sleepForTimeInterval:30];  
        }
    }); 
    dispatch_release(queue_cleanUp);
}

В deleteObjects я использую отдельный managedObjectContext. Если я удаляю некоторые из этих объектов из пользовательского интерфейса, приложение завершает работу, если поток cleanUp работает в фоновом режиме. Ошибка в том, что неисправности не могут быть полностью заполнены.

Может кто-нибудь помочь?

1 Ответ

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

Вы зависаете, потому что контекст переднего плана не знает, что фоновый контекст удалил объекты из постоянного хранилища. Когда контекст переднего плана пытается выполнить сбой в удаленных объектах, происходит сбой.

Вам нужно будет объединить изменения, сделанные в контексте фонового потока, с контекстом потока переднего плана. Вам необходимо зарегистрировать контекст переднего плана в качестве наблюдателя фонового контекста, чтобы он мог обновляться сам перед тем, как пытаться обнаружить какие-либо новые объекты.

В Core Data Books: RootController.m есть хороший пример того, как это сделать. Файл довольно длинный. Сделайте поиск для mergeChangesFromContextDidSaveNotification: и прочитайте подробные комментарии.

...