gpt4 book ai didi

ios - 优化 NSFetchedResultsController 获取

转载 作者:行者123 更新时间:2023-11-28 22:38:47 26 4
gpt4 key购买 nike

我有一个 NSFetchedResultsController 和大量存储在核心数据中的数据,获取的结果 Controller 必须获取这些数据。它将最终获取大约 46,000 件元素。问题是获取时间超过 8 秒,并且在整个时间里,UI 被卡住,因为我们必须在主线程上获取。我想知道我是否可以做些什么来加快速度?

我按对象的创建日期对对象进行排序,提取请求的批量大小为 100,谓词并不过分复杂。它按对象的 UID、类型和所有者的 UID 过滤对象。

由于用户可以搜索,抓取谓词将发生变化,因此在抓取结果 Controller 上设置缓存似乎毫无意义,因为每次抓取谓词更改时它都会被删除。

它与 Core Data 中的对象数量直接相关,因为切换到对象较少的帐户会显着减少获取时间。 (6000 个对象用时不到一秒)。有什么方法可以使它更具可扩展性吗?我的代码如下:

- (NSFetchRequest *)getFetchRequest
{
NSFetchRequest *fetchRequest = [NSFetchRequest requestWithEntityName:@"Photo"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
[fetchRequest setPredicate:[self getFetchPredicates]];
[fetchRequest setFetchBatchSize:100];
return fetchRequest;
}

- (NSPredicate *)getFetchPredicates {
NSMutableArray *predicates = [NSMutableArray arrayWithObjects:
[NSPredicate predicateWithFormat:@"life_uid == %@",[[LoginManager shared] currentLifeUID]],
[NSPredicate predicateWithFormat:@"(type == %@) OR (type == %@)", TLTypeImage, TLTypeVideo],
[NSPredicate predicateWithFormat:@"(ANY stories.permission.owner_person_uid == %@ OR stories.@count == 0)", [[LoginManager shared] currentPersonUID]],
nil];
NSArray *filteredMomentIDs = [[self searchTerms] objectForKey:TLLibraryViewControllerSearchTermsPhotoIDsKey];
if ([filteredMomentIDs count] > 0 && [self searchMode] == kTLLibrarySearchModeTag)
{
[predicates addObject:[NSPredicate predicateWithFormat:@"uid in %@", filteredIDs]];
}
return [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
}

最佳答案

既然你解释(在评论中)所有的属性都是字符串,你可能很难改善这种情况。您在该提取中进行了很多字符串比较——前两个谓词的 46k 记录至少乘以 3,再加上更多取决于那里有多少 stories 关系是平均的。这是您出现性能问题的主要原因 - 进行如此多的字符串比较将成为瓶颈。

一些可能有帮助的事情:

  • 在第三个谓词中,您正在查看 @"(ANY stories.permission.owner_person_uid == %@ OR stories.@count == 0)"。谓词从左到右求值。数字比较比字符串比较快,所以把 @count 检查放在第一位。如果为真,则无需计算后半部分,您将跳过大量字符串比较。
  • 从左到右的事情也适用于您的 NSPredicate 实例的顺序。您可能对数据的样子有所了解 - 确保第一个是限制性最强谓词(即最大数量的对象将通过的谓词)列表中的一个。然后是第二个最严格的,等等。由于您将谓词和-ing 放在一起,所以一个实例失败第一个谓词将不需要与其他谓词进行检查。尽早过滤掉谓词链中的对象。

可能最简单的收获是改变第三个谓词的顺序,然后将其移到列表的前面。

关于ios - 优化 NSFetchedResultsController 获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15163678/

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