Я работаю над приложением Core Data, в котором есть 2 сущности, требующие особой сортировки в NSFetchedResultsController
.
В более простом случае 2 просто игнорируется «The», так что (& IЯ привожу примеры реальных данных) Фестиваль посадки следует за фестивалем Peats Ridge в порядке сортировкиВ целях безопасности я бы также хотел, чтобы такой регистр не учитывался.Для этого я попробовал предложения здесь Как я могу отсортировать 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
.
2-я сущность болеесложно.В дополнение к удалению «The» для сортировки есть также «A» и honififics, такие как «Dr» и «Professor», но не всегда.Примером в данных является театр кукол профессора Яна Лоу и профессора Уоллеса.Йен Лоу - реальный человек, которого (насколько я его уважаю) следует отсортировать по I для Ian, но профессора Уоллеса нет, это просто имя в, ну, кукольном театре, и его следует отсортировать по P. Для этого избирательногоаспект этого я не вижу, кроме как наличие в сущности логического атрибута, указывающего, следует ли удалять 1-е слово для целей сортировки.
В остальном вопрос сводится к ... Есть лиспособ создания (из-за отсутствия более правильного термина) виртуального атрибута в сущности Core Data, который будет работать, когда я передам его имя в качестве ключа для NSSortDescriptor
из NSFetchedResultsController
?
Отчаянный подход, который я бы предпочел не использовать, заключался бы в создании реальных 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;
}
Однако он все еще сортируется по имени.Я вставил «Я здесь».строка журнала в блоке компаратора, которая не появилась в моих журналах, что наводит меня на мысль, что компаратор даже не выполняется.
Cheers & TIA, Pedro:)