7

NSManagedObjectContext 已经添加了 performBlock: 和 performBlockAndWait: 方法来帮助简化并发。我一直在使用它们——可能相当天真——我刚刚意识到有一个我从未真正问过的问题。

如果我在其中一个 performBlock 方法中创建一个 NSManagedObject 子类,它的“主”线程就是它的父上下文的线程——在 NSPrivateQueueConcurrencyType 的情况下,它可能是一个我没有其他访问权限的独立线程。

那么我是否需要调用 performBlock 来访问托管对象中包含的数据?或者在使用吸气剂的情况下,是否有一种背景魔法可以帮助保护我?(或二传手,虽然这似乎是个坏主意……)

4

2 回答 2

16

NSManagedObject不应该在它managedObjectContext的线程/队列之外使用(有时它可以工作,有时你会崩溃==>不要这样做)。

CoreData 不保证对对象的安全读取访问。

要访问“私有队列”上下文所拥有的对象,请始终使用[context performBlock:...]or [context performBlockAndWait:...],除非您访问其objectIDormanagedObjectContext属性。

于 2013-05-20T03:01:31.920 回答
9

您确实需要使用performBlock:or performBlockAndWait:,但有一个例外。如果您正在使用NSMainQueueConcurrencyType 并且正在使用主队列上的托管对象,则可以直接访问它,没有阻塞。当您需要从托管对象更新 UI 时,这会非常方便,反之亦然。

于 2013-05-20T17:26:17.500 回答