KVO无限重复/循环

mar*_*kjs 5 cocoa core-data key-value-observing

我希望能够更改具有startDate和endDate的(日历)事件.还有一段时间.

  1. 当用户更改endDate时,将更新持续时间.
  2. 当用户更改startDate时,endDate会根据持续时间进行更改.
  3. 当用户更改持续时间时,endDate会更改.

最后一个动作将触发第一个动作,该动作将触发第三个动作,这将触发第一个动作无限制(或者当堆栈填满时).

像下面这样的行来更改值,导致这个循环:

        [self setValue:[NSNumber numberWithLong:(interval%60)] forKeyPath:@"durationMinutes"];
        [self setValue:ed forKeyPath:@"endDate"];
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*ton 6

您可以在必要时使用绕过KVO通知setPrimitiveValue:forKey:.设置值但不触发任何通知.它还绕过了您可能拥有的任何自定义设置器.这应该会打破通话周期.

使用此方法时,通常需要调用"将更改"和"更改"方法以确保维护Core Data状态.就是这样的:

[self willChangeValueForKey:@"endDate"];
[self setPrimitiveValue:ed forKey:@"endDate"];
[self didChangeValueForKey:@"endDate"];
Run Code Online (Sandbox Code Playgroud)

这避免了需要一个标志 - 你只是说,嘿,设定值并且没有乱七八糟,好吗?