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
,