Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does a custom accessor method implementation in Core Data look like?

The documentation is pretty confusing on this one:

The implementation of accessor methods you write for subclasses of NSManagedObject is typically different from those you write for other classes.

If you do not provide custom instance variables, you retrieve property values from and save values into the internal store using primitive accessor methods. You must ensure that you invoke the relevant access and change notification methods (willAccessValueForKey:, didAccessValueForKey:, willChangeValueForKey:, didChangeValueForKey:, willChangeValueForKey:withSetMutation:usingObjects:, and didChangeValueForKey:withSetMutation:usingObjects:). NSManagedObject disables automatic key-value observing (KVO, see Key-Value Observing Programming Guide) change notifications, and the primitive accessor methods do not invoke the access and change notification methods.

In accessor methods for properties that are not defined in the entity model, you can either enable automatic change notifications or invoke the appropriate change notification methods.

Are there any examples that show how these look like?

like image 231
dontWatchMyProfile Avatar asked Dec 23 '22 02:12

dontWatchMyProfile


1 Answers

If you go into the Data Model editor, select and entity attribute and then choose "Copy Method Implementation to the Clipboard". It will generate accessors for you. Here is the accessors for the default "timeStamp" property in a Core Data template project:

- (NSDate *)timeStamp 
{
    NSDate * tmpValue;

    [self willAccessValueForKey:@"timeStamp"];
    tmpValue = [self primitiveValueForKey:@"timeStamp"];
    [self didAccessValueForKey:@"timeStamp"];

    return tmpValue;
}

- (void)setTimeStamp:(NSDate *)value 
{
    [self willChangeValueForKey:@"timeStamp"];
    [self setPrimitiveValue:value forKey:@"timeStamp"];
    [self didChangeValueForKey:@"timeStamp"];
}

The basic idea here is that you have to bracket any primitive value changes with willChange... and didChange... calls so that the context knows something is in the process of being changed.

You usually don't have to fiddle with your own accessors unless you have side effects for setting the attribute.

like image 151
TechZen Avatar answered May 19 '23 04:05

TechZen