2015-07-03 27 views
1

我有一個NSManagedObjectContext其中兩個NSManagedObject保存。爲什麼我在CoreData中使用objectWithID時不會得到相同的對象?

我打電話給在另一個線程的方法,我需要訪問這兩個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'>" 

回答

1

瞭解它們是「相同的」,因爲它們引用對象圖中的同一對象。如果你比較所有的屬性,你會發現它們是平等的。

但是,由於它們處於不同的上下文中,它們將成爲此對象的兩個單獨實例。所以你看到的機器地址會有所不同。我希望能夠消除混亂。

至於「故障」,只意味着底層對象(或屬性)還沒有被提取到內存中。這只是一種優化機制,可以最大限度地減少內存佔用。如果您明確記錄對象或屬性,它將從商店中獲取並按預期方式顯示。請參閱Core Data Programming Guide中的「Faulting and Uniquing」。

+0

我認爲使用'existingObjectWithID'實際上是強制這些對象的全部負載。謝謝 – Nico

1

你有一個對象,那就是在覈心版本數據。當您使用objectWithID:時,您將創建該對象的實例。所以,如果你做了兩次,你會得到同一個對象的兩個實例。 (就像你可以創建兩個同一類的對象一樣)

當然,如果你試圖保存你的上下文,改變了一個而不是另一個,可能會發生奇怪的事情。

一個常見的模式是創建一個新的「編輯」託管對象上下文並在那裏創建一個新實例。然後,如果用戶按下取消,您可以刪除上下文,而不必擔心回滾任何更改。我無法想象在同一個上下文中有兩個實例會有用。

相關問題