在两个不同的过程中更新和删除实体

时间:2010-08-02 12:25:40

标签: iphone multithreading ipad core-data


我正在研究使用coredata的ipad应用程序。它下载有关Web上数据库的信息,并将其记录在coredata中。该应用程序基于拆分视图。我的问题是在后台更新数据。
以下是我的工作方式:
- 我创建了一个NSOperation,用于下载和更新数据 - 此NSOperation使用与appDelegate的上下文不同的NSManagedObjectContext,由此函数返回,即在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 :(得分:0)

对不起,我的错误:
- 首先,我的实体包含其他实体,由于关系不良,父权利中包含的实体未被删除。
- 其次,我认为调用-cancelAllOperations将停止当前操作,但事实并非如此,如果使用[self isCancelled]取消进程,则必须检查nsoperation。 这就是全部!

答案 1 :(得分:-1)

如果有人会从界面删除某些东西,你不需要小心,bcs NSArrayController是线程安全的。但如果你在同一时间进行更新和删除,你必须要小心。