bool标志更改后如何调用方法?

时间:2012-11-03 15:39:43

标签: objective-c cocoa

我想在[document doSomething]为假时立即执行[document isBusy]。最好的方法是什么?我尝试了一个while循环,但这延迟了下面的代码,这不是我想要的。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

根据您的问题,isBusydoSomething是您文档的功能,当doSomething变为假时isBusy的操作似乎是语义您的文档模型因此应该由您的文档模型实现,例如:

- (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之间只有许多中间系统方法[document addObserver:self forKeyPath:@"isBusy" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL]; 加上设置KVO的相关开销。

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

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

- (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];
}

在客户端的方法中。然后在您的客户端收到更改通知后,采取适当的措施:

{{1}}

答案 2 :(得分:2)

使用KVC / KVO(键值编码和键值观察)。 Apple文档中详细介绍了该主题。 KVO和KVC是一种基本的编程技术,可以为您的问题提供解决方案。