我有一个NSManagedObjectContext
,其中保存了两个NSManagedObject
。
我在另一个线程中调用一个方法,我需要访问这两个NSManagedObject
,所以我创建了一个子上下文,如下所示:
let childManagedContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
childManagedContext.parentContext = self.managedContext
当我这样做时:
let myNSManagedObject1 = childManagedContext.objectWithID(self.myNSManagedObject1.objectID) as! MyNSManagedObject
let myNSManagedObject2 = childManagedContext.objectWithID(self.myNSManagedObject2.objectID) as! MyNSManagedObject
myNSManagedObject1
和myNSManagedObject2
与self.myNSManagedObject1
和self.myNSManagedObject2
不是同一个对象。有人能解释我为什么吗?
另外,如果我使用existingObjectWithID
代替objectWithID
,我的myNSManagedObject1
和myNSManagedObject2
中的关系似乎仍然存在错误对象:
relationShipObject = "<relationship fault: 0x170468a40 'relationShipObject'>"
答案 0 :(得分:1)
您有一个对象,即核心数据中的版本。使用objectWithID:
时,您可以创建该对象的实例。因此,如果您执行两次,则会获得同一对象的两个实例。 (就像你可以创建同一个类的两个对象一样。)
当然,如果你试图保存你的上下文,改变一个而不是另一个,可能会发生奇怪的事情。
一种常见的模式是你创建一个新的&#34;编辑&#34;托管对象上下文并在那里创建一个新实例。然后,如果用户按下取消,您可以删除上下文,而不必担心回滚任何更改。我无法想象在同一个上下文中有两个实例会有用。
答案 1 :(得分:1)
明白他们是&#34;相同&#34;从某种意义上说,它们指的是对象图中的同一个对象。如果比较所有属性,您会发现它们是相同的。
但是,因为它们位于不同的上下文中,所以它们将是此对象的两个独立实例。所以你看到的机器地址会有所不同。我希望能够消除困惑。
至于&#34; fault&#34;,这只意味着底层对象(或属性)尚未被提取到内存中。这只是一种最小化内存占用的优化机制。如果要显式记录对象或属性,它将从存储中获取并按预期显示。见&#34; Faulting and Uniquing&#34;在Core Data Programming Guide。