我已经问了一个类似的问题,但仍然无法让它发挥作用。我有一个拥有30k +记录的核心数据库。我正在尝试将其提取到tableview中。我观看了WWDC关于核心数据的演示以及演示者建议它对我不起作用的内容。我删除了该表中的大部分字段,只留下了包含nsstring和date的4字段。我使用了不同数字的setFetchBatchSize,但在使用乐器时,fetch控制器正在获取所有30k记录。我看了一遍,仍然不确定我在做什么来降低取水量。我使用了一个单独的线程并显示了svprogreshud,但这使得它更慢我猜,因为线程没有立即运行。
此外,数据分为12个部分,我在核心数据库中有一个字段,其中一个字符用于设置部分。
我还设置了-com.apple.CoreData.SQLDebug 1并且在设备上运行时显示3秒加载该获取请求包含所有记录,但显示 CoreData:sql:pragma cache_size = 200 CoreData:注释:总获取执行时间:36684行为3.1087s。
以下是一些代码
-(void)useDocument{
if (self.peopleDatabase.documentState == UIDocumentStateClosed){
[self.peopleDatabase openWithCompletionHandler:^(BOOL success){
[self setupFetchResultsController];
}];
} else if (self.peopleDatabase.documentState == UIDocumentStateNormal){
[self setupFetchResultsController];
}
}
-(void)setupFetchResultsController
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"people"];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pplicon" ascending:YES]];
[NSFetchedResultsController deleteCacheWithName:nil];
self.fetchedResultsController = nil;
[request setFetchBatchSize:50];
//[request setFetchLimit:100];
self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:self.peopleDatabase.managedObjectContext sectionNameKeyPath:@"pplicon" cacheName:@"peopleCache"];
}
提前谢谢!
UPDATE 再次感谢你的回答 我去核心数据设置到表,并检查pplicon索引。我需要检查其他任何东西。我按照wwdc视频的说明进行操作,并在核心数据读取中运行仪器,它显示NSManagedObjectContext executefetch ..获取计数36684然后另一个具有Fetch Count 12同样在sampler中花费在peopleviewcontroller setupfetchResultsContoroller 363.75ms和UIAplication Run 287.6ms的大部分时间。在活动中监控应用程序占用91mb真实内存。反正有没有改善这个时间?我还能检查什么,看看挂断的地方是什么?
至于部分。我在数据库pplicon中有一个字符,用于显示部分,数据按其排序。
数据模型现在有一个实体,其中5个属性为字符串,1个属性为日期
答案 0 :(得分:0)
是否计算了部分名称?计算部分名称时,Core Data会自动获取所有部分名称并调用部分名称以使其正确排序。
答案 1 :(得分:0)
我想我过去曾就一个非常相似的问题发表过评论。您绝对必须运行仪器并查看其内容。它会告诉你确切的花费时间。
您正在使用部分,这可能很昂贵。您的section属性“pplicon”是否在数据库中设置为索引?如果没有,您肯定必须扫描数据库中的所有项目。您没有扫描所有记录的唯一机会是使其成为索引。内部可能能够仅使用索引表来获取唯一索引值。但是,它仍然必须返回节对象。
同样,你必须在测试时打开乐器,这样你才能确切地看到你花时间在哪里。