NSFetchedResultsController - как sectionNameForKeypath получает свои данные? - PullRequest
0 голосов
/ 21 марта 2011

У меня было несколько ночных кошмаров с NSFetchedResultsController, и, пытаясь найти решение моей проблемы, обрисованной в общих чертах здесь , я натолкнулся на что-то необычное в данных, выбираемых fetchedResultsController, в частности sectionNameForKeypath параметр.

Предположим, у меня есть объектная модель с двумя сущностями и отношениями, как показано ниже:

Элемент << -> Категория

Категория имеет атрибут (NSNumber *) с именем displayOrder, который используется для разделения извлеченных экземпляров Item на разделы в табличном представлении:

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
                                          initWithFetchRequest:fetchRequest
                                          managedObjectContext:moc
                                          sectionNameKeyPath:@"category.displayOrder"
                                          cacheName:nil];

Если бы я хотел как-то динамически манипулировать с выводом displayOrder, очевидным выбором было бы перезаписать его метод получения и делать там все, что я хочу. Но проблема в том, что метод get для displayOrder никогда не доступен во время fetchRequest или fetchedResultsController, даже если я указываю его в sectionNameForKeypath, и я вижу, что fetchedResultsController использует его значения для разделения и отображения разделы.

Вот простой пример перезаписанного метода получения, который никогда не вызывается. Это было размещено в моем классе категории:

-(NSNumber*)displayOrder
{
    NSLog (@"displayOrder getter called");
    NSNumber *displayOrder = [NSNumber numberWithInt:0];
    return displayOrder;
}

Я также пытался перезаписать awakeFromFetch безрезультатно (также не вызывается, но меня это не удивляет, когда я выбираю экземпляры Item и получаю доступ к категории и ее атрибутам через отношения).

Итак, наконец, мой вопрос: как значения category.displayOrder передаются в мой fetchedResultsController и есть ли способ для меня контролировать этот вывод?

Заранее благодарим вас за любые идеи, которые у вас могут быть!

1036 * Рог *

1 Ответ

1 голос
/ 21 марта 2011

Начиная с iOS 3.2, NSFetchedResultsController использует поле, определенное sectionNameKeyPath, непосредственно из базы данных, когда это возможно, вместо создания объектов для каждого элемента.Вы можете попробовать использовать непостоянное свойство для sectionNameKeyPath, которое (согласно документации) заставит его создавать объекты, но если это просто вопрос переименования разделов для UITableView, было бы лучше сделать отображение вtableView:titleForHeaderInSection:.

...