删除后台块中的托管对象

时间:2010-08-17 08:18:51

标签: iphone core-data nsthread objective-c-blocks

在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 个答案:

答案 0 :(得分:1)

您正在崩溃,因为前台上下文不知道后台上下文已从持久性存储中删除了对象。当前台上下文尝试在已删除的对象中发生故障时,它会崩溃。

您需要将后台线程上下文中所做的更改与前台线程的上下文合并。您需要将前景上下文注册为后台上下文的观察者,以便它可以在尝试在任何新对象中发生故障之前自行更新。

Core Data Books: RootController.m就是如何做到这一点的一个很好的例子。该文件相当长。查找mergeChangesFromContextDidSaveNotification:并查看详细注释。