我将活动播放列表中的项目数显示为标签栏项目上的徽章.标签栏项表示的视图控制器正在侦听在更新活动播放列表的内容时触发的特定通知.
我已经实现了这一点,我认为这是一种笨拙的方式,并希望做得更好.它现在确实有用,但我对此并不满意.
目前,每个播放列表对象在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.
那么,我该怎么办?
解决方法
我想这一切都取决于你的实现细节.例如,我在可以在本地修改的数据模型上执行以下操作,并与服务器同步:
- (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]; } }
我不确定为什么这会被认为是坏事.它只是说“做你通常做的事情.此外,我想设置另一个依赖于这种变化的财产.”