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/archive%40mail-archive.com This email sent to arch...@mail-archive.com