次のようなモデルがあります。
特定の pageId で投稿を気に入ったすべてのユーザーを照会しようとしています。指定された pageId に一致する投稿を User.liked に返すだけです。さらに、User.liked の数で並べ替えます。
これをすべて 1 回のフェッチで実行できますか?
これまでの私のコード:
NSFetchRequest* userFetch = [NSFetchRequest fetchRequestWithEntityName:@"User"];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(liked, $x, $x.page.pageId = %@).@count > 0)", self.pageId];
[userFetch setPredicate:predicate];
NSArray *allUsers = [_document.managedObjectContext executeFetchRequest:userFetch error:nil];
これにより、ページに少なくとも 1 つのいいね! がある User オブジェクトのみが正しく表示されますが、User.liked には他のページからの投稿が含まれる可能性があります。さらに、ソートされていません。
これを行うことで、フェッチ後にソートできます。
_users = [allUsers mutableCopy];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"liked.@count" ascending:NO];
_users = [[_users sortedArrayUsingDescriptors:@[sortDescriptor]] mutableCopy];
しかし、その SLOOOOOOOWS すべてがダウンします。フェッチでソートを行う方法がない場合、フェッチ後のソートを高速化するにはどうすればよいですか?
私は CoreData 初心者ですが、このように行き詰まると、通常は CoreData を完全に放り投げてしまい、NSObject をディスクにシリアル化してデータの管理を開始します。ここでそれを行う前に何かヒントはありますか?
ありがとう!