2

我已经问过一个类似的问题,但仍然无法正常工作。我有一个包含 3 万多条记录的核心数据数据库。我正在尝试将其提取到 tableview 中。我观看了关于核心数据的 WWDC 演示文稿,无论演示者建议什么,它都对我不起作用。我从该表中删除了大部分字段,只留下了 4 个包含 nsstring 和日期的字段。我使用了不同数字的 setFetchBatchSize,但在使用仪器时,提取控制器仍在获取所有 30k 记录。我看了一遍,仍然不确定我在做什么来降低获取。我使用了一个单独的线程并显示了 svprogreshud 但这让它变得更慢我猜是因为线程没有立即运行。

此外,数据分为 12 个部分,我在核心数据库中有一个字段,用一个字符来设置部分。

我还设置了 -com.apple.CoreData.SQLDebug 1 并在设备上运行时显示 3 秒加载包含所有记录的获取请求,但显示 CoreData: sql: pragma cache_size=200 CoreData: annotation: total fetch execution time: 3.1087s 36684 行。

这是一些代码

-(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"]; 
}

先感谢您!

更新乔迪再次感谢您的回答。
我去了表的核心数据设置,并检查了索引的pplicon。我还需要检查什么吗。我按照 wwdc 视频的说明并在核心数据中运行仪器,它显示 NSManagedObjectContext executefetch .. Fetch Count 36684 然后另一个 Fetch Count 12 同样在采样器中,peopleviewcontroller setupfetchResultsContoroller 363.75ms 和 UIAplication Run 287.6ms 花费的时间最多。在活动监视器中,该应用程序占用了 91mb 的实际内存。这次有什么可以改进的吗?我还能检查什么,看看挂断在哪里?

就部分而言。我在数据库 pplicon 中有一个字符,用于显示部分,数据按它排序。

数据模型现在有一个实体,其中 5 个属性作为字符串,1 个属性作为日期

4

2 回答 2

0

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

于 2012-05-09T00:30:31.257 回答
0

我想我过去曾评论过一个非常相似的问题。您绝对必须运行 Instruments 并查看它的内容。它会告诉你它在哪里花费时间。

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

Again, you must turn on instruments while testing so you can see exactly where you are spending your time.

于 2012-05-09T00:46:03.643 回答