当每个线程可以处理与其他线程中的数据无关的数据时,是不是可以在线程之间重用一个共享托管对象上下文?
Posted
技术标签:
【中文标题】当每个线程可以处理与其他线程中的数据无关的数据时,是不是可以在线程之间重用一个共享托管对象上下文?【英文标题】:Is it possible to reuse one shared managed object context beetween threads, when each thread can work with data not related to data in other thread?当每个线程可以处理与其他线程中的数据无关的数据时,是否可以在线程之间重用一个共享托管对象上下文? 【发布时间】:2012-10-10 05:58:10 【问题描述】:标题问题的简单示例:一个线程已经准备好 Place 实体并正在对其进行一些处理(填充特定字段并且它们的计算需要时间),同时另一个线程已经准备好 Category 实体;第二个“Category”线程希望使用 save:&error 保存 Category 实体,导致第一个线程中的 Place 实体在未完成处理工作时也被保存。
我说的对吗?如果我使用一个共享 moc,我会看到所描述的问题吗?
谢谢!
【问题讨论】:
【参考方案1】:不要跨线程共享NSManagedObjectContext
s。不要跨线程共享NSManagedObject
s。真的没有例外。阅读Concurrency with Core Data 并应用它描述的模式。
【讨论】:
【参考方案2】:其实是可以的,你要找的方法是:
-(void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification;
您必须为每个线程创建一个不同的NSManagedObjectContext
,您所要做的就是将NSManagedObjectContext
放入NSManagedObjectContextDidSaveNotification
键中的NSNotification
中并将其注册到默认中心。在其调用时在主线程上执行mergeChangesFromContextDidSaveNotification
,您的更改将在您每次调用save:&error
方法时合并。
注意:在我看来,它有一点缺点,当获取一个对象时,它可能属于不同的上下文(获取后它将为零),如果是,你必须以不同的方式获取它:
NSManagedObjectID *objectID = [YourObject objectID];
YourObject *copy =(YourObject*) [managedObjectContext objectWithID:objectID];
希望对您有所帮助。 Here 是一个链接,可以更好地理解我在说什么。
【讨论】:
以上是关于当每个线程可以处理与其他线程中的数据无关的数据时,是不是可以在线程之间重用一个共享托管对象上下文?的主要内容,如果未能解决你的问题,请参考以下文章