Как я могу сделать нечувствительный к регистру тип NSFetchedResultsController, который также игнорирует слова типа «the»?

Я работаю над приложением, основанным на Core Data, которое имеет 2 объекта, требующие особых соображений сортировки в NSFetchedResultsController .

Простейший случай 2 просто требует игнорировать «The», чтобы (и я цитирую реальные примеры данных). Фестиваль посадки следует за Фестивалем торфяников в порядке сортировки. В качестве безопасности я также хотел бы сделать этот регистр нечувствительным. Для этого я попробовал предложения здесь. Как я могу сортировать NSTableColumn из NSStrings, игнорируя «The» и «A»? добавлением…

 @property (nonatomic, readonly) NSString * sortname; 

к интерфейсу моего класса определения сущности & …

 - (NSString *)sortname { NSMutableString *temp = [NSMutableString stringWithString:[[self name] lowercaseString]]; if ([temp hasPrefix:@"the "]) { return [temp substringFromIndex:4]; } return temp; } 

к выполнению, но приложение вылетает, когда я даю ему @"sortname" в качестве ключа для NSSortDescriptor .

Второй объект более сложный. В дополнение к зачистке «The» для сортировки есть также «A» и похвалы, такие как «Dr» и «Professor», но не всегда. Примером может служить профессор Яна Лоу и профессор театра кукол Уоллеса. Ян Лоу – настоящий человек, который (насколько я его уважаю) должен быть отсортирован под I для Яна, но нет профессора Уоллеса, это просто имя в кукольном театре, и его следует сортировать под P. Для этого избирательного Аспект этого я не вижу иначе, чем наличие логического атрибута в сущности, указывает, следует ли разбить 1-е слово для сортировки.

Для остальной части этого вопроса сводится к … Есть ли способ создать (не зная более правильного термина) виртуальный атрибут в объекте Core Data, который будет работать, когда я передам его имя в качестве ключа для NSSortDescriptor NSFetchedResultsController ?

Отчаянный подход, который я бы предпочел не использовать, sortname бы в создании реальных атрибутов sortname для этих двух сущностей и вычислении значений при заполнении объектов.

Обновление … Попытка следовать за ответом TechZen, это конструктор моего NSFetchedResultsController …

 - (NSFetchedResultsController *)frc { if (_frc) return _frc; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"EventProfile" inManagedObjectContext:_moc]; [request setEntity:entity]; NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { NSMutableString *sortname1 = [NSMutableString stringWithString:[obj1 lowercaseString]]; if ([sortname1 hasPrefix:@"the "]) { sortname1 = [NSMutableString stringWithString:[sortname1 substringFromIndex:4]]; } NSMutableString *sortname2 = [NSMutableString stringWithString:[obj2 lowercaseString]]; if ([sortname2 hasPrefix:@"the "]) { sortname2 = [NSMutableString stringWithString:[sortname2 substringFromIndex:4]]; } return [sortname1 compare:sortname2]; }]; [request setSortDescriptors:[NSArray arrayWithObject:sorter]]; [sorter release], sorter = nil; [request setFetchBatchSize:15]; NSFetchedResultsController *frcTemp = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:_moc sectionNameKeyPath:nil cacheName:[NSString GetUUID]]; [self setFrc:frcTemp]; [_frc setDelegate:self]; [frcTemp release], frcTemp = nil; [request release], request = nil; if ([[_frc fetchedObjects] count] == 0) { //<#statements#> } return _frc; } по - (NSFetchedResultsController *)frc { if (_frc) return _frc; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"EventProfile" inManagedObjectContext:_moc]; [request setEntity:entity]; NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { NSMutableString *sortname1 = [NSMutableString stringWithString:[obj1 lowercaseString]]; if ([sortname1 hasPrefix:@"the "]) { sortname1 = [NSMutableString stringWithString:[sortname1 substringFromIndex:4]]; } NSMutableString *sortname2 = [NSMutableString stringWithString:[obj2 lowercaseString]]; if ([sortname2 hasPrefix:@"the "]) { sortname2 = [NSMutableString stringWithString:[sortname2 substringFromIndex:4]]; } return [sortname1 compare:sortname2]; }]; [request setSortDescriptors:[NSArray arrayWithObject:sorter]]; [sorter release], sorter = nil; [request setFetchBatchSize:15]; NSFetchedResultsController *frcTemp = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:_moc sectionNameKeyPath:nil cacheName:[NSString GetUUID]]; [self setFrc:frcTemp]; [_frc setDelegate:self]; [frcTemp release], frcTemp = nil; [request release], request = nil; if ([[_frc fetchedObjects] count] == 0) { //<#statements#> } return _frc; } 

Однако он по-прежнему сортируется по имени. Я вставил «Я здесь». log в блоке компаратора, который не появился в моих журналах, что заставило меня думать, что компаратор даже не выполняется.

Cheers & TIA, Педро 🙂

NSSortDescriptor не принимает переходное свойство. Но есть работа.

В NSFetchedResultsController

установите «sectionNameKeyPath» в качестве вашего фильтра и сохраните NSSortDescriptor в качестве реального столбца, найденного в ваших основных данных. Таким образом, ваш код будет:

 NSFetchedResultsController *fetcher = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"sortname" cacheName:nil]; 

Вероятно, вы хотите использовать дескриптор сортировки с блоком или селектором (функцией), например

 +[NSSortDescriptor sortDescriptorWithKey:ascending:comparator:] 

С блоком или селектором вы можете создавать как сложные, так и настраиваемые типы, которые вам нужны.

Вы также можете использовать несколько сортировок в одном и том же запросе выборки, просто помните, что сортировки оцениваются в последовательности массивов.

  • Сортировка основных данных по дате по возрастанию, затем по нолю
  • Как сортировать дату на TitleForHeaderInSection
  • Как сортировать строки в определенном разделе uitableview
  • Не могу сортировать мой массив NSMutable
  • Сортировка измененного массива на основе другого изменяемого массива?
  • iPhone, как выбрать последнее взятое изображение с UIImagePicker по умолчанию
  • Сортировка NSMutableArray с пользовательскими объектами
  • iOS - tableView, сортировка массива JSON в порядке убывания
  • Swift sort NSArray
  • Сортировка массива объектов модели внутри другого объекта модели
  • Сортировка Swift Set Array
  • Interesting Posts

    Скрыть кнопку подтверждения удаления UITableView после щелчка

    Условно отображать изображение в UITableViewCell

    Предупреждение AppCode «Ресурс не найден» при использовании каталога активов

    Как удалить одиночный чат через xmpp в iOS?

    Альтернативы указателям в Swift?

    Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «Приложение попыталось представить модально активный контроллер

    iOS – подключение к серверу через одноточечную реализацию

    Перенаправление при открытии страницы FB из приложения ios. Зачем?

    webkit.framework отсутствует для arhicteture xxx после добавления Fabric для проекта?

    itunes connect не показывает загруженную сборку

    Как перенести AFHTTPClient, Afnetworking 1.0 в 2.0

    Сегментированная линия только рисует первый сегмент на iPhone. Отлично работает в симуляторе

    Swift: «NSArray?» не конвертируется в «NSArray»?

    UIWebView продолжает пытаться загружать, но без результатов

    iOS Fire локальное уведомление каждый день в определенное время

    Давайте будем гением компьютера.