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
更改时更新UIsetText:
提供了一个自定义访问器,如下所示:
- (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所说,只需监听文本计数的更改并更新两个位置,因为你知道如果计数更改,那么文本也会更改。