cocoa - KVO 无限递归/循环

标签 cocoa core-data key-value-observing

我希望能够更改具有开始日期和结束日期的(日历)事件。还有一个持续时间。

  1. 当用户更改结束日期时,持续时间也会更新。
  2. 当用户更改开始日期时,结束日期会根据持续时间发生变化。
  3. 当用户更改持续时间时,结束日期也会更改。

最后一个操作将触发第一个操作,第一个操作将触发第三个操作,第三个操作将触发第一个操作,无穷无尽(或者当堆栈填满时)。

像下面这样的行,要更改值,会导致此循环:

        [self setValue:[NSNumber numberWithLong:(interval%60)] forKeyPath:@"durationMinutes"];
        [self setValue:ed forKeyPath:@"endDate"];

简单地停止观察并在更改后重新启动并不具有吸引力,因为 GUI 中的值不会更新。 那么问题是:如何安全(且优雅地)更新两个相互依赖的属性之一?

最佳答案

必要时,您可以使用 setPrimitiveValue:forKey: 绕过 KVO 通知。这会设置该值但不会触发任何通知。它还会绕过您可能拥有的属性的任何自定义 setter 。这应该会打破调用周期。

使用此方法时,您通常需要调用“willchange”和“didchange”方法以确保维持核心数据状态。也就是说,类似于:

[self willChangeValueForKey:@"endDate"];
[self setPrimitiveValue:ed forKey:@"endDate"];
[self didChangeValueForKey:@"endDate"];

这避免了对标志的需要 - 你只需说,嘿,设置值,不要乱搞,好吗?

关于cocoa - KVO 无限递归/循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246537/

相关文章:

cocoa-touch - 如何使核心数据实体不可变?

objective-c - GCD 表现不佳

ios - 如何在 Core Data 和 Magical Record 中存储一系列电子邮件

core-data - -primitiveValueForKey :? 有什么意义

ios - 键值观察的新手;为什么我无法在我的 AppDelegate 中监控 int 的值?

cocoa - 无法从...删除关键路径 "..."的观察者...,因为它未注册为观察者

macos - 制作连续重绘Metal NSView的正确方法

macos - SCNRenderer 快照并不总是应用抗锯齿

objective-c - 制作不受管理的 NSManagedObject 的副本

ios - 核心数据 : Insert and delete with To many relationship