核心数据在后台更新

时间:2013-03-07 11:17:41

标签: iphone nsmanagedobjectcontext nsthread

我需要在后台线程中基本更新我的核心数据而不阻止UI并保存它。保存后应重新加载表View以查看更改。所以为了做到这一点,我想到了使用

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
   NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    self.backgroundManagedObjectContext = context;
    if(self.managedObjectContext == nil)
        self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    self.backgroundManagedObjectContext.parentContext = self.managedObjectContext;

    //update data
    [self getDataFromFile];

dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
        [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil];
        [context release];
    });
});

当我尝试获取数据时在getDataFromFile中

if(![NSThread isMainThread])
{
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:self.backgroundManagedObjectContext];
    [request setEntity:entity];
    logs = [self.backgroundManagedObjectContext executeFetchRequest:request error:nil];
}

我收到错误 * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法找到实体名称的NSManagedObjectModel'LogDetails''

任何人都可以解释我收到此错误的原因

另外,我还怀疑是否将其作为后台managedObjectContext或子managedObjectContext包含父作为主线程managedObjectContext

1 个答案:

答案 0 :(得分:1)

一个NSManagedContext只能在一个线程中使用。在线程之间传递NSManagedObject可能不安全。