核心数据中的计算属性

问题描述:

考虑具有两个属性的核心数据实体:text和 - 为了简单起见,textLengthtextLength是每次更改text时计算出的属性。我有三个要求:核心数据中的计算属性

  1. 更新textLength每次text变化,理想的NSManagedObject子里面。
  2. textLength由于性能原因无法根据需求进行计算(我使用的实际计算的属性计算起来要贵得多)。
  3. 每次更新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方法的用途。它会告诉您快照更改的原因,并允许您更新计算/派生数据。

(当您更新派生值时,应使用适当的原始方法设置它)

+0

+1 Nice!所以你会建议把计算逻辑放在两个地方(自定义存取器和'awakeFromSnapshotEvents:')? – hpique

+0

从这两个地方触发,但计算应采用不同的方法... – Wain

+0

我刚刚尝试过这一点,它似乎'awakeFromSnapshotEvents:'在KVO通知被触发后调用,所以它也不能解决问题。那么,我想我也可以观察'textLength',但保持简单会更好。 – hpique