Aha, now we're talking!

So the problem is that after ever change to your model, the controller must 
rearrange its content to match. It knows the change is needed because it 
receives a Key-Value Observing notification of the change. It's got no way to 
know that more changes are about to happen again very shortly and so shouldn't 
bother rearranging just yet.

Ways to fix:

A) Implement manual KVO notifications so that you can do:
        1. willChangeValueForKey:…
        2. Make all the changes in one go
        3. didChangeValueForKey:…

B) Temporarily unbind the controller, make your changes, rebind it.

C) Make your changes using the controller's own methods. 
-insertObject:atArrangedObjectsIndex: etc. It's intelligent enough to know not 
to rearrange the entire content.

Final thought, is -automaticallyRearrangesObjects set to YES? I think if that 
is turned off, the controller won't need to observe every single object in the 
array.

On 17 Dec 2009, at 19:30, Richard wrote:

> jens, this sounds reasonable, i will give it a try.
> 
> mike, i did give it a shot in instruments, comparing the same search with
> and without sorting. i'm not really sure what to make of the results
> however. when sorting is enabled, nearly all the execution time is taken up
> with [NSArrayController setContent:] with the time shared evenly over
> [NSObject removeObserver] and [NSObject addObserver], with only a small
> fraction of the time taken up by actual sorting.
> 
> so, it would seem that the extra workload is in the array controller
> stopping observing the old content, then reobserving the new content. not
> sure what can be done to alleviate this, any suggestions?
> 
> On Thu, Dec 17, 2009 at 5:50 PM, Mike Abdullah 
> <cocoa...@mikeabdullah.net>wrote:
> 
>> As with every performance question. Don't "assume", MEASURE. Fire up
>> Instruments and find out what is using up the CPU.
>> 
>> On 17 Dec 2009, at 15:22, Richard wrote:
>> 
>>> hey
>>> 
>>> i have an app that performs searches over a network connection. the app
>> uses
>>> core data to manage all the search requests (currently using an in memory
>>> store), with an array controller and table view bound to the relevant
>>> results. a search query produces up to about 10000 results, and they are
>>> added to the data model in batches of 10 or so. this all works well,
>> until i
>>> add sorting to the array controller. i then find that the CPU use of the
>>> application stays at 100% and things go pretty slowly from that point on.
>>> 
>>> i assume this is because with each new search result that is being
>> retrieved
>>> and added to the core data model, the array controller is resorting the
>>> entire collection of search results? can anyone suggest a solution to
>> this
>>> problem?
>>> 
>>> thanks
>>> _______________________________________________
>>> 
>>> 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/cocoadev%40mikeabdullah.net
>>> 
>>> This email sent to cocoa...@mikeabdullah.net
>> 
>> 
> _______________________________________________
> 
> 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/cocoadev%40mikeabdullah.net
> 
> This email sent to cocoa...@mikeabdullah.net

_______________________________________________

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