NSManagedObjectContext已经添加了performBlock:和performBlockAndWait:方法,以帮助简化并发。我一直在使用它们 - 可能相当天真 - 我只是意识到有一个我从未真正问过的问题。
如果我在其中一个performBlock方法中创建一个NSManagedObject子类,它的'home'线程是它的父上下文的线程 - 在NSPrivateQueueConcurrencyType的情况下,它可能是一个独立的线程,我没有其他访问权限。 / p>
那么我是否需要执行performBlock调用才能访问托管对象中包含的数据?或者是否有背景魔法来帮助保护我使用吸气剂? (或者是二传手,虽然这看起来像个坏主意......)
答案 0 :(得分:15)
NSManagedObject
不应该在其managedObjectContext
的线程/队列之外使用(有时它会起作用,有时你会崩溃==>不要这样做)。
CoreData不保证对对象的安全读取权限。
要访问“私有队列”上下文所拥有的对象,请始终使用[context performBlock:...]
或[context performBlockAndWait:...]
,除非您访问其objectID
或managedObjectContext
属性。
答案 1 :(得分:9)
您需要使用performBlock:
或performBlockAndWait:
,但有一个例外。如果您正在使用NSMainQueueConcurrencyType
和,那么您正在使用主队列上的托管对象,您可以直接访问它,而不使用任何阻止。当您需要从托管对象更新UI时,这可以非常方便,反之亦然。