NSFetchedResultsController和部分的瞬态属性

时间:2010-08-13 03:35:32

标签: iphone core-data

在数据模型中,我有临时属性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:

这是模型子类

中的瞬态属性getter
- (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 个答案:

答案 0 :(得分:6)

没有看到围绕更新该瞬态属性的代码,我不得不猜测你有一个KVO问题。你可以发布代码吗?

更新

您是否有主题的自定义设置器?如果没有,您是否为uppercaseFirstLetterOfName设置了从属密钥?如果没有,那么这就是你的问题。更改一个值不会触发另一个值更改。这是一个KVO情况。

NSFetchedResultsController专门观察uppercaseFirstLetterOfName并等待它改变。它不只是在观察要改变的对象。因此,当您更改主题时,您还需要“标记”uppercaseFirstLetterOfName。最简单的方法是将以下方法添加到NSManagedObject子类:

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

这将告诉KVO,每当subject属性发生更改时,它也应该触发UppercaseFirstLetterOfName的更改通知。