首先,新代码确实应该更喜欢 GCD 或 NSOperationQueue 而不是 NSThread。如果您发现自己正在使用NSThread
它来放慢速度并重新审视您的设计和实施要求。
其次,跨线程使用 NSManagedObject 非常非常糟糕。如果你只做非常微不足道的事情,那么做正确的事情也会变得非常困难。
最后,无论您如何进行线程网络访问,您都应该更喜欢从托管对象中获取数据并传递它而不是托管对象本身
如果您必须访问托管对象,请确保您的托管对象上下文是NSMainQueueConcurrencyType
或NSPrivateQueueConcurrencyType
,并通过调用performBlock
或performBlockAndWait
使用托管对象的managedObjectContext
属性来访问托管对象。
编辑
好的,让我和你一起检查一下。我目前正在做的是产生一个背景上下文,使用 performBlock 创建一个新的 NSManagedObject,然后保存该背景上下文,切换到父上下文(使用 performblock),使用 existingObjectWithId: 在该上下文中获取新创建的对象。然后,我创建了一个 NSOperation 子类,将 NSManagedObject(来自父上下文)绑定到该 NSOperation 子类(它是子类的一个属性),并将该操作放在 NSOperationQueue 中。在该 NSOperation 中,NSManagedObject 被更改。它似乎工作正常,看起来还可以吗?– 用户 1013725
嗯……也许???我没有遵循。你能发布代码吗?那会更精确,更容易理解。
@JodyHagins所以我没有使用performBlock,但也许没关系,因为managedObjectContext是主要上下文?– 用户 1013725
不。
如果主上下文是使用alloc] init]
or创建的,alloc] initWithConcurrencyType:NSConfinementConcurrencyType
则只有在知道自己在主线程上运行时才必须使用它。
如果它是用alloc] initWithConcurrencyType:NSMainThreadConcurrencyType
然后创建的,那么只有当您知道您在主线程上或在其中一种performBlock
方法中运行时,您才必须使用它。