根据其他答案(例如 Martin R 指出的答案),我将其分为两部分。首先,使用带有 NSDictionaryResultType 的 fetch 请求来获取所有最大 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];
使用两个获取请求不太理想,但提供了使用 SUBQUERY 和/或更改底层数据模型的替代方法。