2010-12-15 30 views
16

我正在使用KVC/KVO爲大學項目創建自定義綁定實現(它需要自定義,因爲我想要做的事情超出了綁定可以做的事情,包括運行iOS版)。爲單個KVC更改接收2個KVO通知

我有一個'綁定控制器',它註冊一個對象上的多個鍵上的KVO通知(使用addObserver:forKeyPath:options:context :),我確實收到通知。不過,每次更改都會收到兩個通知。我有一個解決方法的想法,但我寧願工作爲什麼這是發生和糾正它!

有沒有人有任何想法,爲什麼這可能會發生?我確定我一次只能註冊每個通知,而註銷一次會導致兩個通知都停止。

感謝。

編輯:

我有一些代碼的請求,所以我把一些在這是一個有點粗糙的那一刻,它本質上還是一個概念證明,如此忍受我。

這是我觀察的屬性(我知道這是一個有點陌生,但這個類基本上是公開的NSManagedObject的某些屬性的本身屬性)之一:

- (void)setName:(NSString *)name 
{ 
    [self willChangeValueForKey:@"name"]; 
    [contact setFirstName:name]; 
    [self didChangeValueForKey:@"name"]; 
} 

這是我使用的代碼觀察到財產(確認只運行一次,並且只在一個地方):

[viewModel addObserver:self 
      forKeyPath:@"name" 
       options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) 
       context:viewController]; 

之後,任何調用,改變屬性,如:

viewModel.name = @"Joe"; 
[viewModel setName: @"Joe"]; 
[viewModel setValue: @"Joe" forKey: @"name"]; 

將導致方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

被調用兩次,每次用相同的參數。

+0

安置自己的(相關)的代碼。 – 2010-12-15 16:34:25

回答

21

你這樣做:

- (void)setName:(NSString *)name 
{ 
    [self willChangeValueForKey:@"name"]; 
    [contact setFirstName:name]; 
    [self didChangeValueForKey:@"name"]; 
} 

但是(通過它的聲音)來自非NSManagedObject子類。這意味着Cocoa會嘗試自動爲您發送KVO通知。你也是通過發送你自己的補充。解決方案:

  • 覆蓋+automaticallyNotifiesObserversForKey:到你的方法返回NO
  • 更改爲:

    - (void)setName:(NSString *)name { [contact setFirstName:name]; }

+0

太棒了,這似乎已修復它。我不知道如果你自己實現訪問器,Cocoa會自動發送這些事件。謝謝! – extremeboredom 2010-12-15 20:31:03

1

也許把NSLog放在你的addObserver調用中,看看你是否加了兩個觀察者。

+0

我檢查了這個,addObserver調用只存在於一種方法中,並且我確認該方法只運行一次。 – extremeboredom 2010-12-15 16:02:07