1

次のようなモデルがあります。

ここに画像の説明を入力

特定の 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 をディスクにシリアル化してデータの管理を開始します。ここでそれを行う前に何かヒントはありますか?

ありがとう!

4

1 に答える 1

0

私が覚えている限り、サブクエリでは「 = 」の代わりに「 == 」を使用する必要があるため、サブクエリを試すことができます。

@"(SUBQUERY(liked, $x, $x.page.pageId == %@).@count > 0)"

これにより、その部分が解決される場合がありますbut might include Posts from other Pages in User.liked

編集済み

于 2013-06-26T18:46:14.167 に答える