核心数据中的计算属性
问题描述:
考虑具有两个属性的核心数据实体:text
和 - 为了简单起见,textLength
。 textLength
是每次更改text
时计算出的属性。我有三个要求:核心数据中的计算属性
- 更新
textLength
每次text
变化,理想的NSManagedObject
子里面。 -
textLength
由于性能原因无法根据需求进行计算(我使用的实际计算的属性计算起来要贵得多)。 - 每次更新
text
时更新UI。
我的解决方案几乎就在那里。我提供一个自定义的访问为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采用国际志愿者组织观察员文本的变化:
[someObject addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionNew context:someContext];
这工作正常,在大多数情况下,当我执行撤消除。我直接将Core Data调用setPrimiteValue:forKey:
,这不会触发我的计算逻辑。因此,当UI被通知更改时,textLength
值已过时。
按需计算textLength
的缺点,计算逻辑应该在哪里?
答
这是- (void)awakeFromSnapshotEvents:(NSSnapshotEventType)flags
方法的用途。它会告诉您快照更改的原因,并允许您更新计算/派生数据。
(当您更新派生值时,应使用适当的原始方法设置它)
+1 Nice!所以你会建议把计算逻辑放在两个地方(自定义存取器和'awakeFromSnapshotEvents:')? – hpique
从这两个地方触发,但计算应采用不同的方法... – Wain
我刚刚尝试过这一点,它似乎'awakeFromSnapshotEvents:'在KVO通知被触发后调用,所以它也不能解决问题。那么,我想我也可以观察'textLength',但保持简单会更好。 – hpique