Сортировка по многим отношениям Устанавливается в основных данных - PullRequest
26 голосов
/ 19 августа 2009

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

Ответы [ 6 ]

31 голосов
/ 27 октября 2009

Незначительное улучшение по сравнению с кодом Адриана Хоси:

Вместо ручной итерации по всем рабочим, вы также можете просто сделать:

-(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];
7 голосов
/ 25 января 2013

Незначительное улучшение по сравнению с решением Адриана Шенига:

К настоящему времени необходимо привести 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];
 }
7 голосов
/ 19 августа 2009

Отношения ко многим в Базовых данных моделируются как неупорядоченные наборы. Однако вы можете создать извлеченное свойство в объекте Department, который включает дескриптор сортировки, или вы можете сортировать набор в памяти в вашем приложении (NSArrayController сделает это за вас, установив его свойство sortDescriptors).

3 голосов
/ 29 сентября 2009

Snip-код Hunter почти сработал для меня, за исключением того, что «работники» - это 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];
}
2 голосов
/ 20 августа 2009

Вам нужно определить свой собственный метод, такой как 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];
}
1 голос
/ 11 июля 2012

Я замечаю, что это довольно старо, но люди все еще сталкиваются с этим (я сделал)

Пост Адриана Шенига был хорош. Я нашел это полезным для основы, но вы должны делать это каждый раз, когда вы хотите получить доступ к набору работников. Это очень неэффективно!

Вместо этого лучше выполнять сортировку каждый раз, когда вы вставляете новый объект, а затем сохраняете его как набор в 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]; произойдет после того, как все рабочие будут добавлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...