NSFetchedResultsController和部分的瞬态属性

Pab*_*blo 1 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"];
Run Code Online (Sandbox Code Playgroud)

当我更改从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;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我获取对象并传递给视图控制器进行修改

...
detailViewController.unit = (ModelClass*)[fetchedResultsController 
                                    objectAtIndexPath:indexPath];
...
Run Code Online (Sandbox Code Playgroud)

最后是数据修改

unit.subject = someTextField.text;
...
[unit.managedObjectContext save:&error]
Run Code Online (Sandbox Code Playgroud)

我没有任何其他特殊的瞬态对象,所以我不直接修改它.

Mar*_*rra 6

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

更新

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

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

+ (NSSet*)keyPathsForValuesAffectingUppercaseFirstLetterOfName
{
  return [NSSet setWithObject:@"Subject"];
}
Run Code Online (Sandbox Code Playgroud)

这将告诉KVO,无论何时subject财产发生变化,它都应该发出更改通知UppercaseFirstLetterOfName.

  • 应该`@"主题"`全部小写,即"@"主题"`? (2认同)