For thread-safety's sake why don't you just create a separate
NSManagedObjectContext for your asyncTask?  They are cheap.

-Heath Borders
heath.bord...@gmail.com
Twitter: heathborders
http://heath-tech.blogspot.com



On Tue, Mar 29, 2011 at 4:38 PM, Steve Mykytyn <smyky...@gmail.com> wrote:
> countForFetchRequest seems to bog down on really big collections of
> entities.  For approx 170K entities it takes around 10 seconds on an iPhone
> 3GS to count them, which is a problem in a UITableView where you are trying
> to display a list of entities and associated counts.
>
> A GCD based solution, that queues up countForFetchRequest on a concurrent
> queue for each entity, and then updates the corresponding cell when
> finished, seems to work pretty well, although one or two big entity counts
> essentially bog down all the requests behind them.  Counts are cached so
> that countForFetchRequest is only called once for any entity.
>
> Code below, can anyone suggest any further optimization or different
> approaches that might be more effective?
>
> (I'm aware of the danger of multi-threading core data - this particular
> managed object context never changes and nothing is happening to it on other
> threads when this read is going on)
>
> - (void) countEntitiesNamed:(NSString *)entityName
> inContext:(NSManagedObjectContext *)context forIndexPath:(NSIndexPath
> *)indexPath {
>
> NSNumber *rowCountObject = [self.rowCountMD valueForKey:entityName];
>
> if (rowCountObject) return;
>
> //
> http://www.mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html
>
> dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
> 0), ^{
>
>  NSEntityDescription *ed;
>  NSFetchRequest  *frq;
>
>  frq = [[[NSFetchRequest alloc] init] autorelease];
>  ed = [NSEntityDescription entityForName:entityName
> inManagedObjectContext:context];
>  [frq setEntity:ed];
>  NSDate *startDate = [NSDate date];
>  NSUInteger rowCount = [context countForFetchRequest:frq error:nil];
>  NSTimeInterval timeInterval = -[startDate timeIntervalSinceNow];
>  DLog(@"%0.2lf seconds for %d %@ ",timeInterval,rowCount,entityName);
>
>      dispatch_async(dispatch_get_main_queue(), ^{
>  [rowCountMD setValue:[NSNumber numberWithInteger:rowCount]
> forKey:entityName];
>  UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
>  cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ objects",
>      [NSNumberFormatter localizedStringFromNumber:[NSNumber
> numberWithInteger:rowCount]
>       numberStyle:NSNumberFormatterDecimalStyle]];
>
>       });
>  });
>
>
> }
> _______________________________________________
>
> 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/heath.borders%40gmail.com
>
> This email sent to heath.bord...@gmail.com
>
_______________________________________________

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