NSFetchedResultsController и временное свойство для разделов

В модели данных у меня есть переходное свойство uppercaseFirstLetterOfName который вернет первую букву постоянного свойства. Я указываю это свойство в

NSSortDescriptor* sortByWordDescriptor = [[NSSortDescriptor alloc] 
                    initWithKey:@"subject" ascending:YES];
NSArray* sortArray = [[NSArray alloc]
                    initWithObjects:sortByWordDescriptor, nil];
[fetchRequest setSortDescriptors:sortArray];

NSFetchedResultsController* controller = [[NSFetchedResultsController alloc]
                    initWithFetchRequest:fetchRequest 
                    managedObjectContext:managedObjectContext 
                    sectionNameKeyPath:@"uppercaseFirstLetterOfName" 
                    cacheName:@"Root"];

Когда я изменяю постоянный объект, взятый из fetchedresultscontroller, этот раздел должен быть удален, только controller:didChangeObject пожары. Но так как раздел ушел (на самом деле), я бы ожидал controller:didChangeSection также быть уволенным. Должен ли я сделать что-то дополнительное при изменении персистентного объекта, чтобы сделать controller:didChangeSection вызывается?

UPD:

Это переходный метод получения свойства в подклассе модели

- (NSString *)uppercaseFirstLetterOfName 
{
    [self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
    NSString *aString = [[self valueForKey:@"subject"] uppercaseString];
    NSString *stringToReturn = [aString substringWithRange:
             [aString rangeOfComposedCharacterSequenceAtIndex:0]];
    [self didAccessValueForKey:@"uppercaseFirstLetterOfName"];

    return stringToReturn;
}

Здесь я получаю объект и перехожу на просмотр контроллера для изменения

...
detailViewController.unit = (ModelClass*)[fetchedResultsController 
                                    objectAtIndexPath:indexPath];
...

и, наконец, изменение данных

unit.subject = someTextField.text;
...
[unit.managedObjectContext save:&error]

У меня нет ничего особенного для временного объекта, поэтому я не изменяю его напрямую.

1 ответ

Решение

Без просмотра кода, окружающего обновление этого временного свойства, я должен был бы догадаться, что у вас есть проблема с KVO. Вы можете разместить код?

Обновить

У вас есть пользовательский сеттер для предмета? Если нет, есть ли у вас зависимый ключ для uppercaseFirstLetterOfName? Если нет, то это ваша проблема. Изменение одного значения не приведет к изменению другого значения. Это ситуация с КВО.

NSFetchedResultsController наблюдает за uppercaseFirstLetterOfName конкретно и жду пока это поменяется. Это не просто наблюдение за изменением объекта. Поэтому, когда вы меняете тему, вам нужно пометить uppercaseFirstLetterOfName так же тронут. Самый простой способ сделать это - добавить следующий метод к вашему NSManagedObject подкласс:

+ (NSSet*)keyPathsForValuesAffectingUppercaseFirstLetterOfName
{
  return [NSSet setWithObject:@"Subject"];
}

Это скажет КВО, что всякий раз, когда subject свойство изменилось, что оно также должно запустить уведомление об изменении для UppercaseFirstLetterOfName,

Другие вопросы по тегам