我想尽快执行[document doSomething]
是[document isBusy]
错误的。最好的方法是什么?我尝试了一个while循环,但这会延迟下面的代码,这不是我想要的。
3 回答
如果isBusy
有关联的 setter 方法,则可以调用doSomething
该 setter。更好的选择是使用Key Value Observing来观察它的值isBusy
并在它发生变化时采取行动。
如果操作是文档模型的语义
从您的问题来看,两者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
在与上述示例代码完全相同的点执行,只有一些中间系统方法介于两者之间setIsBusy
,doSomething
再加上设置 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];
}
使用 KVC/KVO(键值编码和键值观察)。Apple 文档中很好地涵盖了该主题。KVO 和 KVC 是一种基本的编程技术,可为您的问题提供可能的解决方案。