Основные данные: передача дополнительного контекста объектам, выбранным с помощью NSFetchedResultsController? - PullRequest
0 голосов
/ 25 января 2010

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity"
                                          inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];

NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY buckets.name == %@", bucketId];
[fetchRequest setPredicate:somePredicate];

frc = [[NSFetchedResultsController alloc] 
       initWithFetchRequest:fetchRequest
       managedObjectContext:moc
       sectionNameKeyPath:@"titleAccessor"
       cacheName:@"frc"];
[fetchRequest release];

Обратите внимание на две вещи:

1) предикат. В моей модели данных SomeEntity и сегменты имеют отношение многие ко многим. Предикат говорит: «вернуть все объекты SomeEntity, чей связанный объект корзины имеет это имя». Работает как положено.

2) Я использую sectionNameKeyPath. На самом деле это метод в объекте модели, который выполняет некоторые вычисления в соответствии с логикой приложения и возвращает заголовок. Работает как положено.

Теперь вопрос:

Как мне соединить эти две вещи и сделать метод titleAccessor осведомленным о предикате? Я хотел бы, чтобы заголовки разделов были разными в зависимости от предиката (если быть точным, в зависимости от bucketId, который я использую в предикате). Чтобы было понятно:

прямо сейчас titleAccessor работает так:

return @"result of some calculation"

Я бы хотел, чтобы это работало так:

if (bucketId == a):
    return @"aPrefix" + @"result of some calculation"
else if (bucketId == b):
    return @"bPrefix" + @"result of some calculation"

У меня есть два подхода: 1) если бы это была обычная загрузка CD (если она есть), я мог бы просто установить какое-либо свойство volatile объектов модели и использовать его. Но у меня нет доступа к объектам результата NSFetchedResultsController. 2) если бы это был SQL, я бы сделал что-то вроде «выберите a, b, c как« что-то »из бла»; во время выполнения, где «c» будет тогда желаемым значением, и я смог бы затем использовать его как свойство. Но это не SQL. :)

Как мне выполнить желаемое поведение, описанное выше?

UPDATE

Конечно, вы сами выясняете ответ сразу после публикации вопроса. (Я полагаю, что отправка сообщений является частью терапии.) Я только что понял, что поместил следующее в свой делегат tableviewcontroller, как написано в документации:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:section];
    return [sectionInfo name];
}

Я мог бы просто сделать необходимое искажение здесь. Это лучший подход? Скажите «да» и сделайте несколько простых замечаний. :) (или предложить еще лучший подход.)

1 Ответ

0 голосов
/ 25 января 2010

Это кажется самым чистым подходом, который я могу придумать. Я не знаю, каким образом сущность может обратиться к предикату, который ее извлек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...