通知动态属性更改的NSFetchedResultsController

时间:2012-10-31 22:22:32

标签: objective-c ios core-data

我有一个NSManagedObject,它具有基于关系的动态属性。我有一个NSFetchedResultsController来获取这些对象的列表。但是,当动态属性发生更改时,发送KVO通知时,NSFetchedResultsController从不调用它的委托来重新加载tableView。

- (BOOL)read
{
    return self.lastMessage.read;
}

- (void)setRead:(BOOL)read
{
    [self.messages enumerateObjectsUsingBlock:^(TSMessage *message, BOOL *stop) {
        message.read = read;
    }];
}

+ (NSSet *)keyPathsForValuesAffectingRead
{
    return [NSSet setWithObject:@"lastMessage.read"];
}

如何强制为managedObject注册更改?

1 个答案:

答案 0 :(得分:1)

在“核心数据编程指南”中,有关于自定义访问者的整个chapter。实质上,您负责调用通知方法。

  

如果要实现自己的属性或一对一关系访问器方法,可以使用原始访问器方法从托管对象的私有内部存储中获取和设置值。您必须调用相关的访问和更改通知方法

因此:

-(BOOL)read {
   [self willAccessValueForKey:@"read"];
   BOOL r = self.lastMessage.read;
   [self didAccessValueForKey:@"read"];
   return r;
}

-(void)setRead:(BOOL)read {
   [self willChangeValueForKey:@"read"];
   [self.messages enumerateObjectsUsingBlock:^(TSMessage *message, BOOL *stop) {
      message.read = read;
   }];
   [self didChangeValueForKey:@"read"];
}