NSSortDescriptor и отношения ко многим - PullRequest
8 голосов
/ 05 октября 2009

У меня есть два типа возражений: местоположения и предметы истории. Я пытаюсь выбрать местоположения, которые прикреплены к любому элементу истории, поэтому мой предикат выборки для этого местоположения - "history. @ Count> 0", который работает нормально.

Я также хотел бы отсортировать объекты местоположения с помощью NSSortDescriptor по дате их последнего элемента истории, который, насколько я могу судить, был бы "history. @ Max.time", однако это выдает следующую ошибку :

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
    reason: 'Keypath containing KVC aggregate where there shouldn't be one;
    failed to handle history.@max.time'

Halp plox?

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

AFAIK, вы должны использовать только операторы сбора , описанные в Руководстве по программированию кодирования значения ключа , для ключевых путей ваших дескрипторов сортировки с collection (NSArray, NSSet, NSDictionary).

Вы не должны использовать операторы сбора для ключевых путей ваших дескрипторов сортировки с запросами на выборку (NSFetchRequest).

@ kdbdallas правильно использует оператор коллекции для сортировки NSArray. Он не использует его для указания дескриптора сортировки запроса на выборку.

Было бы замечательно, если бы операторы сбора работали для определения путей к ключам, по которым сортировались запросы на выборку. Пожалуйста, отправьте этот запрос на http://bugreport.apple.com/. Чем больше будет сообщено, тем больше вероятность, что он его поддержит.

1 голос
/ 05 октября 2009

Возможно, это не лучшее решение, но вы всегда можете извлечь данные и отсортировать их по факту. Взгляните на Сортировка и фильтрация объектов NSArray .

0 голосов
/ 25 ноября 2009

Вот код, который у меня есть, где я делаю подобное

NSError *error;

if (![[self fetchedResultsController] performFetch:&error])
{
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [alert show];
}
else
{
    self.feedsArray = [fetchedResultsController fetchedObjects];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"articles.@max.postDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    self.feedsArray = [feedsArray sortedArrayUsingDescriptors:sortDescriptors];

    [sortDescriptors release];
    [sortDescriptor release];

    NSInteger overviewAmount = [[feedsArray valueForKeyPath:@"@sum.unreadArticles"] integerValue];

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