在使用带有CoreData的objectWithID时,为什么我没有获得相同的对象?

时间:2015-07-03 13:09:54

标签: ios swift core-data

我有一个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

myNSManagedObject1myNSManagedObject2self.myNSManagedObject1self.myNSManagedObject2不是同一个对象。有人能解释我为什么吗?

另外,如果我使用existingObjectWithID代替objectWithID,我的myNSManagedObject1myNSManagedObject2中的关系似乎仍然存在错误对象:

relationShipObject = "<relationship fault: 0x170468a40 'relationShipObject'>"

2 个答案:

答案 0 :(得分:1)

您有一个对象,即核心数据中的版本。使用objectWithID:时,您可以创建该对象的实例。因此,如果您执行两次,则会获得同一对象的两个实例。 (就像你可以创建同一个类的两个对象一样。)

当然,如果你试图保存你的上下文,改变一个而不是另一个,可能会发生奇怪的事情。

一种常见的模式是你创建一个新的&#34;编辑&#34;托管对象上下文并在那里创建一个新实例。然后,如果用户按下取消,您可以删除上下文,而不必担心回滚任何更改。我无法想象在同一个上下文中有两个实例会有用。

答案 1 :(得分:1)

明白他们是&#34;相同&#34;从某种意义上说,它们指的是对象图中的同一个对象。如果比较所有属性,您会发现它们是相同的。

但是,因为它们位于不同的上下文中,所以它们将是此对象的两个独立实例。所以你看到的机器地址会有所不同。我希望能够消除困惑。

至于&#34; fault&#34;,这只意味着底层对象(或属性)尚未被提取到内存中。这只是一种最小化内存占用的优化机制。如果要显式记录对象或属性,它将从存储中获取并按预期显示。见&#34; Faulting and Uniquing&#34;在Core Data Programming Guide