On Wed, May 6, 2009 at 11:55 PM, Graham Cox <graham....@bigpond.com> wrote:
>
>
> I could be wrong, but I don't think this is possible. However, I have
> solved this by minimising the tedium of having to register for all those
> individual property observations as follows:
>
> A. each observable object class exports a list of properties that it thinks
> may be of interest to an observer. This is just an array of strings
> (property names) returned by a class method.
>
> B. A utility method iterates over that list and registers a nominated
> observer against each one. There is also a complementary de-observing
> method.
>
> C. The observer calls the utility method on the child passing itself as an
> observer.
>
> For the observer, this reduces to one line to observe everything. The
> utility methods only need to be written once also, perhaps as an NSObject
> category. The remaining tedium is returning the list of properties from each
> observable class, but it turns out to be pretty quick and easy using
> [NSArray arrayWithObjects:]. You just have to remember to add the name to
> the list any time you add a property to the object. Subclasses should extend
> the list provided by their superclass.
>
> There may well be an easier solution but this works well for me. Relying on
> a keypath being passed through your parent is a bit fragile, since if
> anything changes a child property directly, your parent won't see it. Using
> KVO prevents that problem.
>
> --Graham
>
> You could also use some of the runtime functions [1] to get the names of
every property of an instance.  class_copyPropertyList() would be your first
stop.  You could then write a method (perhaps in a category on NSObject?)
that found all properties on a given object, and registered as an observer
for each of them.  It would look something like:

- (void) addObserver:(id)anObserver forAllPropertiesWithOptions:(
NSKeyValueObservingOptions)theOptions context:(void *)theContext

{

unsigned int propertyCount = 0;

objc_property_t * propertyList = class_copyPropertyList([self class],
&propertyCount);

 for (int i=0; i<propertyCount; ++i) {

const char *propertyName = property_getName(propertyList[i]);

NSString *propString = [NSString stringWithCString:propertyName encoding:
NSUTF8StringEncoding];

[self addObserver:anObserver forKeyPath:propString options:theOptions
context:theContext];

}

}


Note that I have not actually compiled the above code.  I believe it to be
fairly close to something that would work, but make no guarantees.

-BJ Homer

[1]
http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to