当每个线程可以处理与其他线程中的数据无关的数据时,是不是可以在线程之间重用一个共享托管对象上下文?

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】:

不要跨线程共享NSManagedObjectContexts。不要跨线程共享NSManagedObjects。真的没有例外。阅读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 是一个链接,可以更好地理解我在说什么。

【讨论】:

以上是关于当每个线程可以处理与其他线程中的数据无关的数据时,是不是可以在线程之间重用一个共享托管对象上下文?的主要内容,如果未能解决你的问题,请参考以下文章

线程实现Runnable接口比继承Thread的优势

什么是线程安全与线程不安全

线程与进程

线程安全

linux 多线程信号处理总结

Java-NIO 之 Selector 与 Pipe