他の回答 (Martin R が指摘したものなど) に照らして、これを 2 つの部分に分けました。最初に、NSDictionaryResultType でフェッチ リクエストを使用して、すべての最大 uid を取得します。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
[request setEntity:entity];
NSExpression *expr = [NSExpression expressionForKeyPath:@"uid"];
NSExpression *maxExpr = [NSExpression expressionForFunction:@"max:" arguments:@[expr]];
NSExpressionDescription *exprDesc = [[NSExpressionDescription alloc] init];
[exprDesc setExpression:maxExpr];
[exprDesc setName:@"uid"];
NSPropertyDescription *id = [[entity propertiesByName] objectForKey:@"id"];
NSPropertyDescription *cat = [[entity propertiesByName] objectForKey:@"category"];
[request setPropertiesToGroupBy:[NSArray arrayWithObjects:id, cat, nil]];
[request setPropertiesToFetch:[NSArray arrayWithObjects:exprDesc, nil]];
[request setResultType:NSDictionaryResultType];
NSArray *result = [context executeFetchRequest:request error:nil];
NSArray *maxUids = [result valueForKeyPath:@"uid"];
次に、maxUids 配列を使用して、次の述語を使用して対応する NSManagedObjects をフェッチします。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(uid IN %@)", maxUids];
2 つのフェッチ リクエストを使用することは理想的とは言えませんが、SUBQUERY を使用したり、基になるデータ モデルを変更したりする代わりの方法を提供します。