我有一个 NSFetchedResultsController 和存储在核心数据中的大量数据,获取的结果控制器必须获取这些数据。它最终将获取大约 46,000 件物品。问题是获取时间超过 8 秒,并且整个时间,UI 都被冻结,因为我们必须在主线程上获取。我想知道是否有什么办法可以加快速度?
我按对象的创建日期对对象进行排序,获取请求的批量大小为 100,谓词并不过分复杂。它按对象的 UID、类型和所有者的 UID 过滤对象。
由于用户可以搜索,因此 fetch 谓词会发生变化,因此在 fetched results 控制器上设置缓存似乎毫无意义,因为每次 fetch 谓词更改时它都会被删除。
它与 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];
}