Ios 替代重写didChangeValueForKey:在NSManagedObject上
我有一个作为播放列表的托管对象,它与播放列表项有一对多的关系。可以有多个播放列表,但只有一个“活动”播放列表。活动播放列表由托管对象上的布尔属性指示 我将活动播放列表中的项目数显示为选项卡栏项目上的徽章。选项卡栏项目所代表的视图控制器正在侦听特定通知,该通知在活动播放列表的内容更新时触发 我以一种我觉得笨拙的方式实现了这一点,并希望做得更好。目前它确实有效,但我不满意 当前,在Ios 替代重写didChangeValueForKey:在NSManagedObject上,ios,core-data,key-value-observing,Ios,Core Data,Key Value Observing,我有一个作为播放列表的托管对象,它与播放列表项有一对多的关系。可以有多个播放列表,但只有一个“活动”播放列表。活动播放列表由托管对象上的布尔属性指示 我将活动播放列表中的项目数显示为选项卡栏项目上的徽章。选项卡栏项目所代表的视图控制器正在侦听特定通知,该通知在活动播放列表的内容更新时触发 我以一种我觉得笨拙的方式实现了这一点,并希望做得更好。目前它确实有效,但我不满意 当前,在awakeFromFetch上,每个播放列表对象都会检查它是否为活动对象,如果是活动对象,则会将自身注册(使用键值观察)
awakeFromFetch
上,每个播放列表对象都会检查它是否为活动对象,如果是活动对象,则会将自身注册(使用键值观察)为作为关系键的键路径的观察者。当它观察到更改时,会触发通知,从而导致选项卡栏项自身更新
如果播放列表丢失或获得活动状态,它将停止或开始适当地观察自身,因此仅从活动播放列表中触发通知
我想放弃所有自我观察的KVO代码,因为我关心各种入口和出口点,以及何时适当地添加和删除观察员。看起来太脏了
我只想覆盖didChangeValueForKey:
,检查并在必要时发送我的通知,然后调用超级实现。但文件中明确禁止:
didChangeValueForKey:
调用以通知接收方给定属性的值已更改
-(void)didChangeValueForKey:(NSString*)键
参数
钥匙
更改的属性的名称。讨论有关详细信息,请参阅
键值观察编程指南
您不能覆盖此方法。
那么,我能做什么 你想要的是关键价值观。您应该能够注册该特定密钥,并在其更改时收到通知。也请检查一下:我已经解决了这个问题,将一个单独的对象(我用来管理我的核心数据堆栈的单个对象)改为观察者。所有自我观察的复杂性现在都消失了,我不需要担心在awakeFromFetch上添加或删除观察者等等 我刚刚阅读了相同的文档,但是如果你看一下
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];
}
}
我不知道为什么这会被认为是不好的。它只是说“做你通常做的事。此外,我想设置另一个取决于该更改的属性。”这就是我已经在做的,我将编辑问题以使其更清楚。