Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 替代重写didChangeValueForKey:在NSManagedObject上_Ios_Core Data_Key Value Observing - Fatal编程技术网

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];
    }
}

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

这就是我已经在做的,我将编辑问题以使其更清楚。