覆盖NSManagedObject上的didChangeValueForKey:的替代方案是什么?

4
我有一个扮演播放列表角色的托管对象,它与播放列表项目具有一对多的关系。可以有多个播放列表,但只有一个“活动”播放列表。托管对象上的布尔属性指示活动播放列表。
我将活动播放列表中的项目数显示为选项卡栏项上的标记。选项卡栏项代表的视图控制器正在监听特定通知,当活动播放列表的内容更新时触发该通知。
我已经以我认为笨拙的方式实现了这一点,并希望做得更好。目前它确实起作用,但我不满意。
目前,每个播放列表对象在awakeFromFetch上检查是否为活动对象,如果是,则使用键值观察注册自身为观察器,其key路径是关系的键。当它观察到更改时,它触发通知,从而导致选项卡栏项更新自身。
如果播放列表失去或获得活动状态,则适当停止或开始观察自身,因此仅从活动播放列表触发通知。
我想删除所有自我观察KVO代码,因为我担心各种进入和退出点以及何时适当添加和删除观察者。这似乎太糟糕了。
我想只覆盖didChangeValueForKey:,在必要时检查并发送我的通知,然后调用super实现。但是,文档明确禁止这样做:

didChangeValueForKey:

用于通知接收方某个属性的值已更改。

-(void)didChangeValueForKey:(NSString *)key

参数

key

更改的属性名称。

讨论详见键值观察编程指南。

您不能覆盖此方法。

那我该怎么办?
3个回答

1
我刚刚阅读了同样的文档,但是如果你看一下NSManagedObject文档的顶部,它实际上说:“强烈不建议使用...”
我想这完全取决于你的实现细节。例如,对于一个我可以在本地修改并与服务器同步的数据模型,我会执行以下操作:
- (void)didChangeValueForKey:(NSString *)key
{
    [super didChangeValueForKey:key];  // MUST CALL THIS!

    if ([key isEqualToString:NSStringFromSelector(@selector(name))] ||
        [key isEqualToString:NSStringFromSelector(@selector(text))] ||
        [key isEqualToString:NSStringFromSelector(@selector(filename))]
        )
    {
        self.lastModified = [NSDate date];
    }
}

我不确定为什么这会被认为是不好的。它只是在说“做你通常做的事情。此外,我想设置另一个取决于该更改的属性。”


0

这就是我正在做的,我会编辑问题以使其更清晰。 - jrturton

0

我通过创建一个单独的对象(一个单例,用于管理我的核心数据堆栈)作为观察者来解决了这个问题。所有自我观察的复杂性现在都消失了,我不需要担心在 awakeFromFetch 等方法中添加或删除观察者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接