4

無論何時添加某種類型的實體(並可能更改/刪除),我都希望得到通知。核心數據:觀察某個類型的新實體

我讀過它可以通過添加一個觀察者到managedObjectContext。但是,我還沒有找到一個實際的方法來做到這一點。

我做:

[context addObserver:self forKeyPath:@"{myEntityName}" options:{I have tried several different values, but I am failing to understand which one to use} context:@"NewEntity"]; 

感謝您的幫助。

注意:我顯然是coredata/cocoa/objective-c的新手,這可能是非常基本的,但一直追求太久的答案。無法找到有關如何正確觀察上下文對象更改的示例和/或解釋(我能夠在沒有問題的情況下觀察特定實體的更改)。

BTW:這是一個類似的問題,這表明這是可能的,但是我沒有細節:Core Data: Observing all changes on Entity of certain type

回答

8

首先,不要混淆實體和對象。實體是與類相似的抽象,並且它們永遠不會被添加到託管對象上下文或從託管對象上下文中刪除。它是添加到託管對象上下文或從託管對象上下文中刪除的託管對象。每個託管對象都被鍵入數據模型中的實體,就像任何其他對象實例被鍵入特定的類一樣。

因此,您真正需要的是在插入/更新/刪除鍵入特定實體的託管對象時收到通知。

處理最簡單的方法是爲上下文的註冊:

NSManagedObjectContextObjectsDidChangeNotification 

...這將提供每當在上下文中的管理對象插入/更新/刪除的通知。要僅查找鍵入特定實體的託管對象,請檢查由NSInsertedObjectsKey,NSUpdatedObjectsKey和NSDeletedObjectsKey鍵返回的對象,然後檢查每個對象的屬性entity

或者,您可以使用自定義的NSManagedObject子類並重寫awakeFromInsert以在首次插入對象時發出通知。

我會注意到這樣的功能很少需要。當您發現自己接通了很多通知時,通常是這表明您的數據模型需要重新工作才能捕獲更多信息。您通常需要通知,因爲數據模型的某些關鍵邏輯未在覈心數據中編碼,而是駐留在需要通知的外部對象中。

+2

謝謝!這解決了。對於任何尋找特定代碼的人:'[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector({some method})name:NSManagedObjectContextObjectsDidChangeNotification object:context];' – rufo

0

我選擇這種方法來代替,感覺清潔:

  • 創建一個實體,基於NSArrayController(使用Interface Builder來寫更少的代碼)
  • 觀察你的陣列控制器的arrangedObjects關鍵路徑
  • 完成。