У меня есть две модели отдела и рабочего. Отделы имеют много отношений (рабочих) к работнику. Рабочий имеет поле firstName. Как я могу получить список рабочих, отсортированный по первому имени, путем доступа к сотрудникам отдела. Есть ли способ добавить дескрипторы сортировки во многих отношениях?
Сортировка toMany отношения Установить в основных данных
Ответ 1
Незначительное улучшение по сравнению с кодом Адриана Хосей:
Вместо ручного повторения всех работников вы также можете просто сделать:
-(NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Наверное, делает то же самое, что и ваша итерация внутри, но, возможно, они сделали ее более эффективной. Это, конечно, меньше печатает...
Примечание: выше работает только на iOS 4.0+ и OSX 10.6+. В более старых версиях вам нужно заменить последнюю строку:
return [[self.workers allObjects] sortedArrayUsingDescriptors:sortDescriptors];
Ответ 2
Взаимодействие со многими в Core Data моделируется как неупорядоченные множества. Однако вы можете создать выбранное свойство в сущности отдела, которое включает дескриптор сортировки или вы можете сортировать в памяти в своем приложении (NSArrayController
сделает это для вас, установив его свойство sortDescriptors
).
Ответ 3
Незначительное улучшение по сравнению с решением Адриана Шенига:
В настоящее время необходимо отбрасывать self.workers
в NSSet *
-(NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [(NSSet*)self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Ответ 4
Сценарий кода охотника почти сработал у меня, за исключением того, что "рабочие" - это NSSet, мне пришлось сначала загрузить его в NSMutableArray:
- (NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
NSMutableArray *sortThese = [NSMutableArray arrayWithCapacity:[self.workers count]];
for (id worker in self.workers) {
[sortThese addObject:worker];
}
return [sortThese sortedArrayUsingDescriptors:sortDescriptors];
}
Ответ 5
Вам нужно определить свой собственный метод, например sortedWorkers. Что-то вроде этого:
- (NSArray *)sortedWorkers {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortNameDescriptor, nil] autorelease];
return [self.workers sortedArrayUsingDescriptors:sortDescriptors];
}
Ответ 6
Я замечаю, что это довольно старый, но люди все равно наткнутся на него (я сделал)
Адриан Шениг был хорошим. Я нашел это полезным для основ, но вы должны делать этот вид каждый раз, когда хотите получить доступ к набору работников. Это очень неэффективно!
Вместо этого лучше делать сортировку каждый раз, когда вы вставляете новый объект, а затем сохраняете его как Set in CoreData. Это означает, что каждый раз, когда вы вызываете CoreData, заказываются рабочие.
Я сделал это для своей системы, используя Категория для NSManagedObject (Worker + Methods.h). Здесь у меня есть метод init для нового Worker
// Worker+Methods.m
+(Worker *)newWorkerWithFirstname:(NSString *)firstName department:(Department *)department managedContext:(NSManagedObjectContext *)context {
Worker *w = [NSEntityDescription insertNewObjectForEntityForName:@"Worker" inManagedObjectContext:context];
w.firstName = firstName;
w.department = department;
[department orderWorkers];
return s;
}
//Department+Methods.m
-(void)orderServices {
NSSortDescriptor *sortNameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES] autorelease];
self.workers = [[NSSet alloc] initWithArray:[self.workers sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortNameDescriptor]]];
}
Очевидно, что это неэффективно, когда вы добавляете много Рабочих, но вы можете просто переместить [department orderWorkers]; произойдет после того, как будут добавлены рабочие.