核心数据中的计算属性

时间:2014-01-20 10:47:11

标签: ios objective-c macos cocoa core-data

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

  1. 每次textLength更改text,最好在NSManagedObject子类内更改。
  2. 由于性能原因,
  3. textLength无法按需计算(我正在使用的实际计算属性计算起来要贵得多)。
  4. 每次text更改时都会更新用户界面。
  5. 我的解决方案几乎就在那里。我正在为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,计算逻辑应该在哪里?

1 个答案:

答案 0 :(得分:1)

这是- (void)awakeFromSnapshotEvents:(NSSnapshotEventType)flags方法的目的。它告诉您快照更改的原因并允许您更新计算/派生数据。

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