ios – 替代覆盖didChangeValueForKey:在NSManagedObject上

前端之家收集整理的这篇文章主要介绍了ios – 替代覆盖didChangeValueForKey:在NSManagedObject上前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个托管对象作为播放列表,它与播放列表项有很多关系.可以有多个播放列表,但只有一个“活动”播​​放列表.活动播放列表由托管对象上的布尔属性指示.

我将活动播放列表中的项目数显示标签栏项目上的徽章.标签栏项表示的视图控制器正在侦听在更新活动播放列表的内容时触发的特定通知.

我已经实现了这一点,我认为这是一种笨拙的方式,并希望做得更好.它现在确实有用,但我对此并不满意.

目前,每个播放列表对象在awakeFromFetch上检查它是否是活动的,如果是,则将其自身(使用键值观察)注册为关键路径的观察者,该关键路径是关系的关键.当它观察到更改时,它会触发通知,这会导致标签栏项自行更新.

如果播放列表丢失或获得活动状态,则会停止或开始正确观察自身,因此通知仅从活动播放列表中触发.

我想放弃所有自我观察的KVO代码,因为我担心各种进入和退出点以及何时适当地添加删除观察者.看起来太脏了.

我想重写didChangeValueForKey :,如有必要,检查并发送我的通知,然后调用超级实现.但是文档中明确禁止这样做:

didChangeValueForKey:

Invoked to inform the receiver that the value of a given property has changed.

-(void)didChangeValueForKey:(NSString *)key

Parameters

key

The name of the property that changed. Discussion For more details,see
Key-Value Observing Programming Guide.

You must not override this method.

那么,我该怎么办?

解决方法

我刚刚阅读了相同的文档,但如果你看一下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];
    }
}

我不确定为什么这会被认为是坏事.它只是说“做你通常做的事情.此外,我想设置另一个依赖于这种变化的财产.”

猜你在找的iOS相关文章