gpt4 book ai didi

objective-c - 有没有办法加快从核心数据中获取

转载 作者:行者123 更新时间:2023-12-01 16:57:28 27 4
gpt4 key购买 nike

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

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

我还设置了 -com.apple.CoreData.SQLDebug 1 并在设备上运行时显示 3 秒加载带有所有记录的获取请求,但显示
CoreData: sql: pragma cache_size=200
CoreData:注释:总提取执行时间:3.1087 秒,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 个属性作为日期

最佳答案

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

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

再说一次,你 必须在测试时打开仪器,这样您就可以准确地看到您在哪里花费时间。

关于objective-c - 有没有办法加快从核心数据中获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10508124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com