我想在[document doSomething]
为假时立即执行[document isBusy]
。最好的方法是什么?我尝试了一个while循环,但这延迟了下面的代码,这不是我想要的。
答案 0 :(得分:3)
如果isBusy
具有关联的setter方法,则可以在该setter中调用doSomething
。更好的选择是使用Key Value Observing来观察isBusy
的值,并在其发生变化时采取措施。
答案 1 :(得分:3)
如果操作是文档模型的语义
根据您的问题,isBusy
和doSomething
是您文档的功能,当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
,在setIsBusy
和doSomething
之间只有许多中间系统方法[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是一种基本的编程技术,可以为您的问题提供解决方案。