Не секрет, что при использовании NSFetchedResultsController можно группировать сущности в секции, например, чтобы отображать в UITableView. Рассмотрим пример. Предположим у нас есть сущность Contact с полем NSString* lastName. Сгруппируем в секции по полю lastName.
Не пугайтесь конструкции <#smth#> в коде. Если скопировать этот код в XCode — <#smth#> превратиться в placeholder.
NSFetchRequest* fetchRequest = <#fetchRequest#>; NSManagedObjectContext* context = <#context#>;NSFetchedResultsController* myFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"lastName" cacheName:nil];
Будем отображать результаты выборки в UITableView. NSFetchedResultsController будет выделять уникальные имена. Мы увидим что-то вроде того что на картинке.
Что делать если мы хотим сгруппировать по первой букве? Конечно же мы можем создать свойство у сущности, которое будет возвращать первую букву и группировать по этому свойству. Но в таком случае нужно будет создавать такое свойство у всех сущностей, которые мы хотим вывести в UITableView группируя по первой букве.
Предлагаю рассмотреть следующий вариант. sectionNameKeyPath требует у нас keypath (подчиняется KVC). Т.е. фактически мы можем передать туда какое-либо свойство NSString или метод без параметров.
Так как у NSString нету метода, который сразу вернет первую букву — предлагаю сделать категорию на NSString, которая будет содержать такой метод:
@interface NSString (firstLetter) - (NSString *) firstLetter; @end @implementation NSString (firstLetter) - (NSString *) firstLetter { if (!self.length || self.length == 1) return self; return [self substringToIndex:1]; } @end
Теперь мы можем сделать вот так:
NSFetchRequest* fetchRequest = <#fetchRequest#>; NSManagedObjectContext* context = <#context#>;NSFetchedResultsController* myFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"lastName.firstLetter" cacheName:nil];
Обратите внимание на @ «lastName.firstLetter». Мы фактически вызвали у NSString метод firstLetter и сгруппировали сущности по результату, который вернет этот метод. Теперь группировка будет действительно по первой букве!
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: