我试图对一个NSOperation进行子类化,并从中读取一些样本,他们说:当任务完成后,使用NSOperation的KVO完成操作,代码如下:
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"]
finished = YES;
executing = NO;
[self didChangeValueForKey:@"isFinished"];
[self didChangeValueForKey:@"isExecuting"];
然后isFinished被召唤
- (BOOL) isFinished{
return(finished);
}
谁能解释一下这个给我?为什么isFinished被调用,isFinished会完成操作吗?正如我所说,KVO手动需要[self didChangeValueForKey:@“isExecuting”];我没有看到像addobserver:和observeValueForKeyPath这样的代码:
我写
-(void)call
{
[self willChangeValueForKey:@"isVip"];
[self didChangeValueForKey:@"isVip"];
}
-(void)isVip
{
NSLog(@"Im vip");
}
[自我呼叫]时不调用isVip;
3 回答
NSOperationQueue
实现将观察您的操作的"isFinished"属性(使用KVO),因此它知道何时从队列中删除它 .isFinished
很可能在被告知其值的变化后被内部Apple代码调用 .添加到quellish的答案,这是你如何覆盖执行,完成,取消 .
我认为这比有更清楚
首先,您不需要进行手动KVO通知 . 对于
NSOperation
子类,除非您的类通过实现+automaticallyNotifiesObserversForKey
或+automaticallyNotifiesObserversOf<Key>
返回NO而选择退出自动KVO通知,否则应自动发送KVO通知 .除非将子类添加到
NSOperationQueue
,否则NSOperation
子类不是很有用 . 将操作添加到队列时,队列使用KVO来观察指示状态更改的属性,例如finished
,executing
,cancelled
等 . 请注意,这些不是isFinished
,isExecuting
或isCancelled
- 这些是合成获取这些属性的访问器 .在您的问题中,您包含以下代码:
你在这里做的是为get访问者发送手动KVO通知,而不是观察到的属性 . 相反,这将完成你似乎想要做的事情:
不是直接访问实例变量,而是使用访问器方法 . 这将正确发送这些属性的自动更改通知 .
如果您是关于KVO的 truly paranoid 并且想要发送get访问者密钥路径(例如
isFinished
)的通知,请将您的属性注册为密钥路径的依赖项:Registering dependencies is part of KVO compliance.