2012-02-15 62 views
3

我有一個對象 - Config。我想知道Config上的Account屬性是否已更改。發生這種情況時,我想發送一個NSNotification,以便在Account更改將知道時關心所有代碼。我最初的想法是在我的NSManagedObject子類中,我將覆蓋setAccount方法來將瞬態屬性AccountDidChange設置爲true。然後在didSave如果AccountDidChangetrue我會發送通知,然後將其設回false。有沒有更好的辦法?我的問題是,從我讀過的內容來看,通過將AccountDidChange更改回false,我會弄髒我的物體並需要再次保存。核心數據NSManagedObject - 跟蹤屬性是否已更改

有點多信息: Config對象是應用程序的當前配置。 Account實際上可以更改爲ActiveAccount。與具有所有帳戶列表的Account實體有關係。這個想法是,用戶可以更改應用程序的活動帳戶。所以我們有一組服務器,用戶一次只能登錄一個。 Config.Account指向該活動帳戶,它用於建立到服務器的連接以檢索信息。我正在使用此通知,Config.Account已更改爲告知其他對象清理其信息 - 如警報列表。基本上,所有信息都是按照每個帳戶進行的,因此需要將其刪除,然後使用新的活動帳戶重新進行下次加載。

此外,給定的名稱不是我的實際對象名稱 - 只是試圖讓示例更容易遵循。

回答

7

看看KVO(鍵值觀測):Key-Value Observing Programming Guide。這是在Cocoa中做到這一點的標準方法,並且是您需要理解爲一名優秀的Cocoa程序員的基本技術。

KVO將讓關注Account屬性(您可能應該命名爲account而不是Account)的屬性更改的對象在屬性更改時得到通知。 KVO將「爲標準的NSManagedObjects」工作,而不需要你做任何額外的工作。

相關的方法如下:

  • -addObserver:forKeyPath:options:context:您的配置對象調用來設置觀察
  • -observeValueForKeyPath:ofObject:change:context:將觀測對象隨時對被稱爲觀測值改變
  • -removeObserver:forKeyPath:您需要確保在觀察者不再需要更改通知(包括觀察者被釋放之前)時調用它。

這在連接文檔中有更詳細的描述。

編輯下面:

不知道關於你的任何應用程序,這是很難知道你爲什麼會想只有在保存通知。 NSManagedObjectContext發佈NSManagedObjectContextWillSaveNotification和NSManagedObjectContextDidSaveNotification。通知的userInfo具有包含插入,更新和刪除對象的數組,但通知並不像單個屬性那樣精細。我想你可以手動跟蹤didSave通知之間的更改帳戶。如果您的商店中有大量Config,那麼效率可能會很低。

對NSManagedObjects的更改是即時的,它們只是在託管對象上下文中調用​​之前才保存到持久存儲區。也許如果你更多地解釋你想要完成什麼以及爲什麼,我可以更好地提供幫助。

+0

如果我正確理解了這一點,那麼當account改變時不會調用observeValueForKeyPath ...,而不僅僅是當它被保存。我想我應該更具體一點,我想知道它何時實際保存到商店。另外,也許我有第二個問題 - 這不完全理解何時/如何保存更改。即使我更改了我的配置帳戶的值,但它在保存之前並未真正更改。也許更改和保存應該發生在第二個上下文中,然後合併到主應用程序上下文中。這對我來說仍然是新鮮的,但謝謝你。 – Brian 2012-02-15 18:27:27

+0

我添加了更多信息 - 感謝您的幫助。 – Brian 2012-02-15 19:31:59

+0

我仍然不明白爲什麼你只想通過保存通知,而不是當活動帳戶更改時。但是,由於應用程序中顯然只有一個Config對象,因此很容易在應用程序控制器中跟蹤對其的更改(或者最有意義的地方),並在託管對象上下文的NSManagedObjectContextDidSaveNotification中發佈通知(如果活動帳戶自上次保存以來發生了變化。 – 2012-02-15 19:45:12