2013-06-24 39 views
2

叫了兩聲我有一個的NSOperation子類,它實現setFinished:生成KVO通知:可可志願:observeValueForKeyPath:ofObject變化:背景:爲一個價值變動

-(void)setFinished:(BOOL)isFinished 
{ 
    LogError(@"%@ will will changing isFinished to %d",self,isFinished); 
    [self willChangeValueForKey:@"isFinished"]; 
    LogError(@"%@ did will changing isFinished to %d",self,isFinished); 
    _isFinished = isFinished; 
    LogError(@"%@ will did changing isFinished to %d",self,isFinished); 
    [self didChangeValueForKey:@"isFinished"]; 
    LogError(@"%@ did did changing isFinished to %d",self,isFinished); 
} 

我也相信,我有隻能將觀察者添加到操作中一次。

奇怪的事情來了,有時observeValueForKeyPath:ofObject:change:context:此對象的isFinished關鍵路徑稱爲兩次,指的是日誌,我只找到setFinished:調用一次,並addObserver:forKeyPath:此操作只調用一次。

另外,我發現它的順序是這樣的:

will will changing isFinished to 1 
did will changing isFinished to 1 
will did changing isFinished to 1 
calling observeValueForKeyPath for object 
did did changing isFinished to 1 
calling observeValueForKeyPath for object 

所以任何人有任何線索,請?

+0

的'iphone'標籤暗示的iOS,而'cocoa'意味着OSX。你的意思是? – rmaddy

+1

KVO在兩個系統上都是一樣的。 –

+0

@rmaddy我只想讓我的問題再暴露一點,如果我遇到了一些法規,請通知我,謝謝。 – CarmeloS

回答

5

如果你想負責撥打willChangeValueForKey:didChangeValueForKey:,你必須告訴系統。你可以這樣做有兩種方式:

如果不實現這些類的方法之一正確,系統會自動在setFinished:返回通知觀察員。它看起來就是你在日誌中看到的。

+0

爲了支持來自KVO頭部的評論:'自動通知觀察者'的變體在Leopard的[基礎發行說明](https://developer.apple.com/library/mac/releasenotes/Cocoa/FoundationOlder.html#KVCKVO )。 –

0

您不需要執行'setFinished:'。

的志願方法observeValueForKeyPath:ofObject變化:背景:從被越來越調用一次setFinished:又一次,你已經顯式地通知使用

的變化[自willChangeValueForKey:@ 「isFinished」];

解決的辦法是調用[self willChangeValueForKey:@「isFinished」];只有當u設定變量「finished'as如下:

[self willChangeValueForKey:@"isFinished"]; 
self.finished = YES; 
[self didChangeValueForKey:@"isFinished"]; 

不中重寫setFinished:

+1

因爲'self.finished = YES'發送'setFinished:'消息,所以不需要在那裏調用'willChangeValueForKey:'和'didChangeValueForKey:',正如你所說,它會自動處理通知。 –