Вы не можете сортировать по весу ролей, потому что можно иметь более одной подходящей роли.
Вы также не можете прийти к ней из роли (в отличие от человека), потому что выиметь много ко многим между ролью и человеком.
Вы должны переосмыслить свой дизайн, потому что наличие такого количества ко многим не имеет особого смысла.Небольшая ненормализация данных, замена этого «многие ко многим» на «один ко многим» и дублирование значений ролей и ролей позволят решить эту проблему.
Обновление
Предполагаяизменил дизайн на:
Company --< Role >-- Person
Тогда решение становится намного проще:
- (NSArray*)peopleSortedByWeightInCompany:(NSString*)company inManagedObjectContext:(NSManagedObjectContext*)moc
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Role" inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:@"company.name == %@", companyName]];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"weight" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sort]];
NSError *error = nil;
NSArray *roles = [moc executeFetchRequest:request error:&error];
[request release], request = nil;
NSAssert2(roles != nil && error == nil, @"Error fetching roles: %@\n%@", [error localizedDescription], [error userInfo]);
NSArray *people = [roles valueForKeyPath:@"@distinctUnionOfObjects.person"];
return people;
}
В основном вы выбираете объекты ролей, отсортированные по весу и отфильтрованные по названию компании.Из этого массива ролевых сущностей вы затем используете KVC, чтобы собрать все личные объекты на другом конце отношения, которые будут извлекать их по порядку.