我一直在試圖解決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