我一直在试图解决NSOperation子类中的一个问题,我觉得它可能与我们的KVO的手动更改通知有关。所有我检查的来源似乎做更新的NSOperation状态时的情况如下:多个KVO键:为什么要调用willChangeValueForKey:在didChangeValueForKey之前两次:?
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO;
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];
[self didChangeValueForKey:@"isExecuting"];
相反,我们一直在做这样的:
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = NO;
[self didChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];
任何人能告诉我,为什么前似乎是这样做的推荐方式?
似乎苹果的KVO文档也推荐了第一种方法。 (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW3)/
有趣。似乎这种模式需要了解NSOperation内部观察者如何处理状态变化。你知道有没有关于这方面的进一步文件? – fyell
您是指操作队列如何观察其操作?这不一定就是这个。其他东西可以观察操作属性。我正在写关于一般情况。不,我没有关于队列如何观察他们的操作并对这些变化作出响应的进一步文档。 –
不在NSOperationQueue级别。我假设当一个NSOperation被初始化时,它也会自己建立KVO。我做了这个假设,因为这个调用我在堆栈跟踪崩溃中看到'[__NSOperationInternal _observeValueForKeyPath:ofObject:changeKind:oldValue:newValue:indexes:context:]'。 – fyell