NSFetchedResultsController と、フェッチされた結果コントローラーがフェッチする必要がある Core Data に大量のデータが格納されています。最終的にフェッチされるアイテムは約 46,000 です。問題は、フェッチに 8 秒以上かかることと、メイン スレッドでフェッチする必要があるため、その間ずっと UI がフリーズしていることです。これをスピードアップするために何かできることがあるかどうか疑問に思っていましたか?
オブジェクトを作成日順に並べ替えています。フェッチ リクエストのバッチ サイズは 100 で、述語はそれほど複雑ではありません。UID、タイプ、および所有者の UID によってオブジェクトをフィルタリングします。
ユーザーは検索できるため、フェッチ述語が変更されるため、フェッチ述語が変更されるたびに単純に削除される場合、フェッチされた結果コントローラーにキャッシュを持っていても無意味に思えます。
これは、コア データ内のオブジェクトの数に直接関連しています。これは、オブジェクトが少ないアカウントに切り替えると、フェッチ時間が大幅に短縮されるためです。(6000 個のオブジェクトには 1 秒もかかりません)。これをよりスケーラブルにする方法はありますか? 私のコードは次のとおりです。
- (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];
}