我希望能够更改具有开始日期和结束日期的(日历)事件。还有一个持续时间。
- 当用户更改结束日期时,持续时间也会更新。
- 当用户更改开始日期时,结束日期会根据持续时间发生变化。
- 当用户更改持续时间时,结束日期也会更改。
最后一个操作将触发第一个操作,第一个操作将触发第三个操作,第三个操作将触发第一个操作,无穷无尽(或者当堆栈填满时)。
像下面这样的行,要更改值,会导致此循环:
[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/