• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Binding of invisible controls: is lazy data loading possible?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Binding of invisible controls: is lazy data loading possible?


  • Subject: Re: Binding of invisible controls: is lazy data loading possible?
  • From: Ken Thomases <email@hidden>
  • Date: Mon, 19 Jan 2009 17:11:41 -0600

On Jan 19, 2009, at 3:27 PM, Quincey Morris wrote:

2. If some change affects which objects are cached, update the cache array KVO-compliantly. (Use standard NSMutableArray methods on [yourCacheOwner mutableArrayValueForKey: @"yourCacheArray"] instead of yourCacheArray.)

This is common advice, but in my opinion it's misguided.

While directly mutating an array ivar doesn't generate KVO notifications, and mutating the proxy returned by - mutableArrayValueForKey: does, that's not the best means to gain KVO compliance. You should instead implement the indexed to-many accessors[1] for any to-many property. Then, you should use them to mutate the property in your own code.

What's wrong with -mutableArrayValueForKey:?

Here's one good guideline: in general, KVC is for accessing a property based on dynamic data rather than compile-time identifier. If you find yourself hard-coding string literals with property names, then You're Doing It Wrong(tm).

More importantly, -mutableArrayValueForKey: doesn't magically allow for mutations to the property that aren't already allowed by your class's interface. In particular, if you don't provide the indexed to- many accessors, then mutating the proxy returned by - mutableArrayValueForKey: ends up doing the inefficient call to set<Key>: that you were trying to avoid. (In other words, it has the same negative implications as will/didChangeValueForKey:.) Since that's the case, why not just call -set<Key>: yourself rather than having the proxy do it?

(There is an exception to the above, but it's hardly worth mentioning. If your property has neither indexed to-many mutator methods nor the simple setter method, and +accessInstanceVariablesDirectly returns YES, then the proxy may directly access the NSMutableArray-like ivar. In that case, the proxy can do efficient operations on the property along with efficient KVO notifications using did/willChange:valuesAtIndexes:forKey:. However, except for cases of backward compatibility, you should always override +accessInstanceVariablesDirectly to return NO for your classes. Allowing KVC to directly modify your internal state without going through your methods is bad mojo.)

Regards,
Ken

[1] The indexed to-many accessors for array properties are described here:

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/AccessorConventions.html#/ /apple_ref/doc/uid/20002174-178830-BAJEDEFB

See also the documentation for -mutableArrayValueForKey: although some additional methods are only documented in NSKeyValueCoding.h at the declaration of -mutableArrayValueForKey:.

The (non-indexed) to-many accessors for set properties are described in the documentation for -mutableSetValueForKey:.

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: Binding of invisible controls: is lazy data loading possible?
      • From: Quincey Morris <email@hidden>
    • Re: Binding of invisible controls: is lazy data loading possible?
      • From: Quincey Morris <email@hidden>
References: 
 >Binding of invisible controls: is lazy data loading possible? (From: "Vitaly Ovchinnikov" <email@hidden>)
 >Re: Binding of invisible controls: is lazy data loading possible? (From: Quincey Morris <email@hidden>)

  • Prev by Date: Re: CALayer unwanted blurring
  • Next by Date: Re: Memory allocation issues with NSObject and NSString
  • Previous by thread: Re: Binding of invisible controls: is lazy data loading possible?
  • Next by thread: Re: Binding of invisible controls: is lazy data loading possible?
  • Index(es):
    • Date
    • Thread