Подтвердить что ты не робот

Сортировка toMany отношения Установить в основных данных

У меня есть две модели отдела и рабочего. Отделы имеют много отношений (рабочих) к работнику. Рабочий имеет поле firstName. Как я могу получить список рабочих, отсортированный по первому имени, путем доступа к сотрудникам отдела. Есть ли способ добавить дескрипторы сортировки во многих отношениях?

4b9b3361

Ответ 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]; произойдет после того, как будут добавлены рабочие.