gpt4 book ai didi

ios - 替代覆盖 didChangeValueForKey : on NSManagedObject

转载 作者:可可西里 更新时间:2023-11-01 06:12:07 34 4
gpt4 key购买 nike

我有一个充当播放列表的托管对象,它与播放列表项具有一对多关系。可以有多个播放列表,但只有一个“事件”播​​放列表。事件播放列表由托管对象上的 bool 属性指示。

我将事件播放列表中的项目数显示为标签栏项目上的角标(Badge)。选项卡栏项表示的 View Controller 正在监听特定通知,该通知在更新事件播放列表的内容时触发。

我以我认为笨拙的方式实现了这一点,并希望做得更好。它目前确实有效,但我对此并不满意。

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

如果播放列表失去或获得事件状态,它会停止或开始适本地观察自己,因此通知只会从事件播放列表中触发。

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

我只想覆盖 didChangeValueForKey:,检查并在必要时将通知发送到那里,然后调用 super 实现。但这在文档中被明确禁止:

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 - 替代覆盖 didChangeValueForKey : on NSManagedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9634951/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com