What are the 'primitive' accessors for in Core Data?
Asked Answered
K

2

18

From the Core Data Programming Guide (my emphasis):

By default, Core Data dynamically creates efficient public and primitive get and set accessor methods for modeled properties (attributes and relationships) of managed object classes.

Although I've been using Core Data and mogenerator happily since I started on Objective-C, I've never had a look at what this means, until an app submission got rejected due to alleged use of private API. Long story about a generated setPrimitiveTypeValue: method, but not what my question is about.

While reading the guide I stumbled on the idea of public and primitive accessors for entity attributes. Another quote, but further down:

For example, given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstName:, primitiveFirstName, and setPrimitiveFirstName:.

What are the primitive accessors for? Is it just so you can assign a BOOL value directly, without wrapping it in an NSNumber? If so, why would mogenerator have gone through the trouble of generating all kinds of <Attribute>Value, set<Attribute>Value:, primitive<Attribute>Value, setPrimitive<Attribute>Value: accessors?

I'm confused, who can help me out?


Related questions:

Karmen answered 15/9, 2011 at 7:39 Comment(1)
Someone else [answered this one already][1] with what looks like a good answer. [1]: #5509606Comfortable
T
12

As far as I understand it, the primitive method does the actual getting and setting, but does not issue any KVC or KVO notifications (‘willAccessValueForKey‘ and so on). The public method calls the primitive method, but wraps the call in the KVO calls. So from outside the object, you'd typically call the public methods, but if you needed to use the properties of the object for internal reasons (to validate or derive some other property, for example) you would use the primitive methods to avoid firing all the notifications.

I'd welcome any corrections or clarifications on the answer as it is a subject I am interested in but not fully versed in.

Trumaine answered 15/9, 2011 at 8:24 Comment(2)
Awesome answer @jrturton. Just adding this link as a reference if people want to have a quick look at Custom Primitive Accessor Methods in the Core Data doc which backs up your answer.Bunton
@Bunton that link is now obsolete.Quatrefoil
P
1

@jrturton's answer covered issues regarding Custom Attribute and To-One Relationship Accessor Methods, where public-accessor is straightforward.

In addition, to fully support To-Many Relationship Accessors, in custom implementation, public-accessors may have to call primitive-accessors in combination with NSMutableSet methods (unionSet: and minusSet:), which must be wrapped inside KVO method pairs ( will...did...).

Prop answered 28/6, 2014 at 4:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.