I have an attribute modificationDate
in my Entity A.
I want to set its value whenever NSManagedObject
is saved. However, if i try to do that in NSManagedObject
willSave:
method, i get an error:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Failed to process pending changes before save. The context is still dirty after 100 attempts. Typically this recursive dirtying is caused by a bad validation method, -willSave, or notification handler.' ***
So, i'm wondering, what's the best way to set the value of modificationDate
?
In fact the apple docs (which are only half read in the accepted answer) don't recommend this method. They explicitly say you should use NSManagedObjectContextWillSaveNotification. An example might be:
@interface TrackedEntity : NSManagedObject
@property (nonatomic, retain) NSDate* lastModified;
@end
@implementation TrackedEntity
@dynamic lastModified;
+ (void) load {
@autoreleasepool {
[[NSNotificationCenter defaultCenter] addObserver: (id)[self class]
selector: @selector(objectContextWillSave:)
name: NSManagedObjectContextWillSaveNotification
object: nil];
}
}
+ (void) objectContextWillSave: (NSNotification*) notification {
NSManagedObjectContext* context = [notification object];
NSSet* allModified = [context.insertedObjects setByAddingObjectsFromSet: context.updatedObjects];
NSPredicate* predicate = [NSPredicate predicateWithFormat: @"self isKindOfClass: %@", [self class]];
NSSet* modifiable = [allModified filteredSetUsingPredicate: predicate];
[modifiable makeObjectsPerformSelector: @selector(setLastModified:) withObject: [NSDate date]];
}
@end
I use this (with a few other methods: primary key for example) as an abstract base class for most core data projects.