0

我想尽快执行[document doSomething][document isBusy]错误的。最好的方法是什么?我尝试了一个while循环,但这会延迟下面的代码,这不是我想要的。

4

3 回答 3

3

如果isBusy有关联的 setter 方法,则可以调用doSomething该 setter。更好的选择是使用Key Value Observing来观察它的值isBusy并在它发生变化时采取行动。

于 2012-11-03T15:41:16.117 回答
3

如果操作是文档模型的语义

从您的问题来看,两者isBusy都是doSomething您的文档的功能,以及doSomething何时isBusy变为 false 的操作似乎是您的文档模型的语义,因此应该由您的文档模型实现,例如:

- (void) setIsBusy:(BOOL)flag
{
   if(flag != _isBusy) // check if this is a change
   {
      _isBusy = flag;
      if(flag)
      {
         // doSomething, or schedule doSomething if it is a long operation etc., e.g.
         [self doSomething];
      }
   }
}

使用 KVO在单个对象中实现语义可能不常见,但在某些情况下它很有用。在这种情况下,它将用间接操作代替直接操作——KVO 将doSomething在与上述示例代码完全相同的点执行,只有一些中间系统方法介于两者之间setIsBusydoSomething再加上设置 KVO 的相关开销。

如果操作是文档客户端的语义

当然,如果这两者之间的联系独立于您的文档模型,即您的文档的客户端的语义,那么 KVO 是合适的并且将在您的客户端中实现。您的客户将注册为您的文档的观察者,例如:

[document addObserver:self
           forKeyPath:@"isBusy"
              options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
              context:NULL];

在客户端的方法中。然后在收到更改通知时在您的客户端中采取适当的操作:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
   if ([keyPath isEqual:@"isBusy"] && object == document)
      [document doSomething;
   else
      [super observeValueForKeyPath:keyPath
                           ofObject:object
                             change:change
                            context:context];
}
于 2012-11-03T18:05:03.490 回答
2

使用 KVC/KVO(键值编码和键值观察)。Apple 文档中很好地涵盖了该主题。KVO 和 KVC 是一种基本的编程技术,可为您的问题提供可能的解决方案。

于 2012-11-03T15:45:48.097 回答