Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 岩心数据中的计算属性_Ios_Objective C_Macos_Cocoa_Core Data - Fatal编程技术网

Ios 岩心数据中的计算属性

Ios 岩心数据中的计算属性,ios,objective-c,macos,cocoa,core-data,Ios,Objective C,Macos,Cocoa,Core Data,考虑一个具有两个属性的核心数据实体:text,为了简单起见,textLengthtextLength是每次text更改时计算的属性。我有三个要求: 每次text更改时更新textLength,最好在NSManagedObject子类中 由于性能原因,textLength无法按需计算(我使用的实际计算属性计算起来要昂贵得多) 每次text更改时更新UI 我的解决方案就快到了。我为setText:提供了一个自定义访问器,如下所示: - (void)setText:(NSString *)text {

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

  • 每次
    text
    更改时更新
    textLength
    ,最好在
    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中使用KVO观察文本更改:

    [someObject addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionNew context:someContext];
    
    这在大多数情况下都可以正常工作,但执行“撤消”时除外。我将核心数据直接调用
    setPrimiteValue:forKey:
    ,这不会触发我的计算逻辑。因此,当UI收到更改通知时,
    textLength
    值已过时


    除了按需计算
    textLength
    之外,计算逻辑应该在哪里?

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


    (更新派生值时,应使用适当的基本体方法进行设置)

    +1很好!因此,您建议将计算逻辑放在两个位置(自定义访问器和
    awakeFromSnapshotEvents:
    )?我刚刚尝试了这个方法,结果显示在触发KVO通知后调用了
    awakeFromSnapshotEvents:
    ,因此也无法解决问题。嗯,我想我也可以观察
    textLength
    ,但最好让它更简单。事实上没有。我仍然有一个问题,因为当对象处于不一致的状态时,UI会收到更改通知,这可能会导致错误。你为什么不观察文本计数?它总是在最后更改,并同步发送通知。正如@Wain所说,只需监听文本计数的更改并更新两个位置,因为你知道如果计数更改,那么文本也会更改。