我有一个“产品”实体的数据库,大约有4万到5万个条目。我有一个视图,允许用户滚动实体表(我知道糟糕的设计,但这是客户想要的)。
“产品”实体如下所示:
**Product:**
- part_number (string) (indexed)
- list_price (string)
- manufacturer_partNumber (string)
- productDescription (string)
- productID (string)
• inventory (NSManagedObject, 1..n)
- name (string)
- quantity (string)
• manufacturer (NSManagedObject, 1..1)
- name (string)
- manufacturerID (string)
首先,我以标准方式创建NSFetchedResultsController
,返回所有产品实体,并在part_number
上设置排序描述符。我跳过了所有的箍,试图加快抓取:
这样做我只能得到大约~3.5分钟。不好。
所以从EXPLAIN QUERY我看到花了很多时间来获取inventory
和manufacturer
个实体。合理但仍然不好。所以我决定只返回 Product 实体的一些属性,而不是返回那些属性。
以下是我使用setPropertiesToFetch
- part_number (string) (indexed)
- list_price (string)
- photo (string)
- productID (string)
在part_number
上设置了排序描述符,其中fetchBatchSize
为15.这将获取时间缩短到约40秒。仍然不好。
我知道有人会在这里问我是如何设置NSFetchedResultsController
:
- (NSFetchedResultsController *)fetchedResultsControllerWithCacheName:(NSString*)cacheName {
[NSFetchedResultsController deleteCacheWithName:cacheName];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Product" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"part_number" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:15];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPropertiesToFetch:@[@"part_number", @"list_price", @"photo", @"productID"]];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
cacheName:cacheName];
return theFetchedResultsController;
}
我可以做任何其他来加快速度吗?
我有一个想法可能真的很hacky是使用NSFetchedResultsController进行某种类型的延迟加载(是的,我知道它假设要处理它)。我没有完全考虑过这一点,但是设置setFetchLimit
说100并使用NSPredicate在最后part_number
之后加载内容。这可能只是耗时。