Thanks Ken,
I was able to solve the problem by not using NSMutableArray's
addObjectsFromArray method. Instead I replaced it with:
NSMutableArray * eventsArrayProxy = [self mutableArrayValueForKey:@"events"];
NSRange range = NSMakeRange([events count], [appointments count]);
NSIndexSet *indexes = [NSIndexSet indexSetWithIndexesInRange:range];
[eventsArrayProxy insertObjects:appointments atIndexes:indexes];
And now the updates are sent to the observer all at once.
My own personal conclusion is that insertObjects:atIndexes: works much better
with KVO then addObjectsFromArray:
Thanks!
Mazen Abdel-Rahman
On Jun 9, 2010, at 3:13 PM, Ken Thomases wrote:
> On Jun 9, 2010, at 3:19 PM, Mazen M. Abdel-Rahman wrote:
>
>> I have a view class that observes changes in a model class's array via KVO.
>> Unfortunately - when ever the array is updated - the updates are sent to the
>> view one at at a time.
>>
>> In my model class I have the following line:
>>
>> NSMutableArray * eventsArrayProxy = [self
>> mutableArrayValueForKey:@"events"];
>> [eventsArrayProxy addObjectsFromArray:appointments];
>>
>> Which naturally causes the following method in my view class to be invoked:
>>
>> -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
>> change:(NSDictionary *)change context:(void *)context
>>
>> My problem is that observeValueForKeyPath.. is invoked once for each and
>> every single item in the appointments array (the array being added) - rather
>> than once for all of them. Is this standard behavior? And is there a way
>> to have it call observeValueForKeyPath.. one time for all the objects being
>> added?
>>
>> In my case - I am sometimes adding as much as a thousand or more objects -
>> so it is a severe performance issue right now. If this is the only way KVO
>> works for arrays then I will have to find another way around it - but I'm
>> hopeful perhaps there's some way this can be done.
>
> You don't say how the "events" property is implemented in terms of accessor
> methods.
>
> Be sure to read these:
>
> <http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/AccessorConventions.html#//apple_ref/doc/uid/20002174-178830-BAJEDEFB>
> <http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/SearchImplementation.html#//apple_ref/doc/uid/20000955-SW2>
> <http://developer.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/Performance.html#//apple_ref/doc/uid/20002175-171187>
>
> Implementing the multiple-object variants of the mutating indexed accessor
> methods will almost certainly alleviate the problem. By the way, if you
> implement those indexed accessor methods, then you don't need to use
> -mutableArrayValueForKey:. You can just directly message "self" with the
> appropriate accessor.
>
> Regards,
> Ken
>
_______________________________________________
Cocoa-dev mailing list ([email protected])
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 [email protected]