Cocoa 将NSOperation的自定义子类标记为已终止?
我已经创建了NSOperation的一个自定义子类,并覆盖了Cocoa 将NSOperation的自定义子类标记为已终止?,cocoa,key-value-observing,nsoperation,nsoperationqueue,Cocoa,Key Value Observing,Nsoperation,Nsoperationqueue,我已经创建了NSOperation的一个自定义子类,并覆盖了main方法 @interface WGTask : NSOperation @property(readonly) BOOL isExecuting,isFinished; @end @implementation WGTask @synthesize isExecuting,isFinished; - (void)start { ... [self willChangeValueForKey:@"isFinish
main
方法
@interface WGTask : NSOperation
@property(readonly) BOOL isExecuting,isFinished;
@end
@implementation WGTask
@synthesize isExecuting,isFinished;
- (void)start {
...
[self willChangeValueForKey:@"isFinished"];
isFinished=YES;
[self didChangeValueForKey:@"isFinished"];
...
}
@end
但此代码会引发EXC_BAD_访问错误。删除
[self-didChangeValueForKey:@“isFinished”]
和[self-willChangeValueForKey:@“isFinished”]
可以解决问题,但即使正确更新了isFinished
值,NSOperationQueue也不会删除该操作 不要将iExecuting等创建为属性
从文档中:
如果要实现并发操作,则应重写此方法以返回操作的执行状态。如果确实覆盖了它,请确保在操作对象的执行状态发生更改时为isExecuting密钥路径生成KVO通知。有关手动生成KVO通知的更多信息,请参阅《键值观察编程指南》
实际上,您可能希望使用NSO操作的cancel语义
您也可以阅读
和(如果您使用这些标志进行依赖关系管理)
我的错。在调用
[self-willChangeValueForKey:@“isFinished”]
之前,我正在调用自定义子类的委托方法,在该方法中,我正在释放任务本身。这就是为什么我得到了EXC\u BAD\u访问错误,因为self
已经不存在了。谢谢你的回答,但是删除所有属性并覆盖-(BOOL)是执行,而-(BOOL)是完成的似乎不起作用。我仍然收到EXC_BAD_访问错误。也许我忘了什么。我是否必须实现一些其他方法才能使KVO正常工作?主要问题是操作队列在操作终止时没有收到通知。这可能有助于重新阅读几次以获得它(这也有帮助),但我最终发现我的视图是“自动删除”的,这就是为什么我获得了exc_bad_访问权限。