考虑具有两个属性的核心数据实体:text
和 - 为简单起见 - textLength
。 textLength
是每次text
更改时计算的属性。我有三个要求:
textLength
更改text
,最好在NSManagedObject
子类内更改。textLength
无法按需计算(我正在使用的实际计算属性计算起来要贵得多)。text
更改时都会更新用户界面。我的解决方案几乎就在那里。我正在为setText:
提供自定义访问器,如下所示:
- (void)setText:(NSString *)text
{
static NSString *key;
if (!key) key = NSStringFromSelector(@selector(text));
[self willChangeValueForKey:key];
[self setPrimitiveText:text];
self.textCount = text.count;
[self didChangeValueForKey:key];
}
在UI中使用KVO来观察文本更改:
[someObject addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionNew context:someContext];
除非我执行撤消操作,否则在大多数情况下都可以正常工作。我直接采用核心数据调用setPrimiteValue:forKey:
,这不会触发我的计算逻辑。因此,当UI通知更改时,textLength
值已过时。
如果没有按需计算textLength
,计算逻辑应该在哪里?
答案 0 :(得分:1)
这是- (void)awakeFromSnapshotEvents:(NSSnapshotEventType)flags
方法的目的。它告诉您快照更改的原因并允许您更新计算/派生数据。
(更新派生值时,应使用适当的原始方法设置它)