I have an object - Config
. I want to know if the Account
attribute on Config
has changed. When this happens, I want to send a NSNotification
so that all code that cares about when the Account
changes will know. My initial thought was in my NSManagedObject
subclass that I would override the setAccount
method to set a transient attribute AccountDidChange
to true
. Then in didSave
if AccountDidChange
was true
I would send the notification and then set it back to false
. Is there a better way? My issue though is that from what I've read, by changing AccountDidChange
back to false
, I would have dirtied my object and need to save again.
A little more info:
The Config
object is the current configuration of the application. Account
could actually be changed to ActiveAccount
. There is a relationship to the Account
Entity that has a list of all Accounts. The idea is that the user can change the active account of the application. So we have a set of servers and the user can only be logged into one at a time. Config.Account
points to that active account and it is used to setup connections to the server to retrieve information. I am using this notification that Config.Account
has changed to tell other objects to clean up their information - like list of alerts. Basically, all information is per Account so it needs to be removed and then refetched on its next load with the new active account.
Also, the given names are not my actual object names - just trying to make the example easier to follow.
Take a look at KVO (Key-Value Observing): Key-Value Observing Programming Guide. That's the standard way to do this in Cocoa, and is a fundamental technology that you need to understand to be a good Cocoa programmer.
KVO will let objects that care about changes to the
Account
property (which you should probably nameaccount
, notAccount
) register to be notified when the property is changed. KVO will "just work" for standard NSManagedObjects, without any additional work on your part.The relevant methods are as follows:
-addObserver:forKeyPath:options:context:
which you call on your Config object to set up the observation-observeValueForKeyPath:ofObject:change:context:
which will be called on the observer object anytime an observed value is changed-removeObserver:forKeyPath:
which you need to make sure you call when the observer no longer needs change notifications (including before the observer is deallocated).This is all described in a lot more detail in the linked documentation.
EDIT BELOW:
Without knowing anything about your application, it's hard to know why you'd want to be notified only upon save. NSManagedObjectContext posts NSManagedObjectContextWillSaveNotification and NSManagedObjectContextDidSaveNotification. The notification's userInfo has arrays containing inserted, updated and deleted objects, but the notifications aren't as fine-grained as individual properties. I suppose you could manually keep track of changed accounts between didSave notifications. That'll probably get inefficient if you have lots of Configs in your store.
Changes to NSManagedObjects are immediate, they're just not saved to the persistent store until you call
save:
on the managed object context. Perhaps if you explain more about exactly what you're trying to accomplish and why, I can better help.