有没有办法加快从核心数据获取

时间:2012-05-08 23:54:38

标签: objective-c ios

我已经问了一个类似的问题,但仍然无法让它发挥作用。我有一个拥有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个属性为日期

2 个答案:

答案 0 :(得分:0)

是否计算了部分名称?计算部分名称时,Core Data会自动获取所有部分名称并调用部分名称以使其正确排序。

答案 1 :(得分:0)

我想我过去曾就一个非常相似的问题发表过评论。您绝对必须运行仪器并查看其内容。它会告诉你确切的花费时间。

您正在使用部分,这可能很昂贵。您的section属性“pplicon”是否在数据库中设置为索引?如果没有,您肯定必须扫描数据库中的所有项目。您没有扫描所有记录的唯一机会是使其成为索引。内部可能能够仅使用索引表来获取唯一索引值。但是,它仍然必须返回节对象。

同样,你必须在测试时打开乐器,这样你才能确切地看到你花时间在哪里。

相关问题