Как сгруппировать в NSFetchedResultsController сущности по первой букве?

Не секрет, что при использовании 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 будет выделять уникальные имена. Мы увидим что-то вроде того что на картинке.

Как сгруппировать в 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 и сгруппировали сущности по результату, который вернет этот метод. Теперь группировка будет действительно по первой букве!

Рейтинг
( Пока оценок нет )
webnewsite.ru / автор статьи
Загрузка ...

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: