2013-01-21 7 views
8

KVOが発生します。その後、私は同じ値を割り当てます。KVO割り当てられた値が異なるものではない

self.myValue = 2; 

KVOが再び発生します。私はObjective-CのKVOが割り当てられた値が違っていなければ起動しないと推測していました。私は間違っているようです。

このデフォルトの動作を強制する方法はあります、すなわち、値が割り当てられるたびに発射KVO通知を無効にしますか?私は自分のアクセサを作成することができますが、私は...すべての回答のため

感謝を変更したいプロパティが多い場合には、この作業のかなり多くある可能性があります。セッター(または他のミューテータ)が呼び出され

+0

を、それは時に値が変更されたとき、特定の通知のみが発射されていることをいくつかの理由で重要である場合それを設定する前にカスタムセッターを書くか、値をチェックする必要があります。つまり、if(self.myValue!= 2)self.myValue = 2'です。 – lnafziger

+0

素晴らしい質問です。これはApple docoで決して本当に明白になることはありません。 – Fattie

答えて

13

KVO火災。追加チェックはありません。一般に、KVOは非常に軽量で性能に敏感です。不必要な変更は通常は稀で、ほとんどの場合、オブザーバに無害ですから、古い値をチェックする余分なオーバーヘッドは含まれません。以前の値を確認するのは高価な場合があります。たとえば、管理オブジェクトにフォールトが発生していない場合は、このケースを確認するために多くの作業を行うのがデフォルト動作ではありません。

あなたは値を変更したり、あなたがオプションNSKeyValueObservingOptionNew|NSKeyValueObservingOptionOldを渡すことによって、オブザーバーとして行うことができなかったかをチェックする必要がある場合。新しい値と古い値の両方が表示され、その情報で何かを行うかどうかを決めることができます。私は実際には、これは非常に頻繁には必要ないはずであることを発見しました。 (手動変更通知を使用して)セッターにこのロジックを追加するだけで、参照用

+1

ええ、私はこれを回避するためにNSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld値を使用しています。それは大したことではない、私はちょうどこれを行うためのより簡単で「組み込みの」方法があるかどうか疑問に思っていた。乾杯! –

+0

私はまったく同じ考えを持っていました、Niall。たとえ値が同じであっても、実際にはシステムがメッセージを送信しているというRobからの確認を聞くことは良いことです。思うように、そしてここでは、私はパフォーマンスのために純粋に意味します(まれなケースで重要です) "送信側"をチェックして、それが変更されていない値である(したがって単に設定しない) (受信者が非常に多く、複雑な比較や文字列などを作成している場合など)「受信側」をチェックするのではなく、 Rob Napierにもう一度感謝します。 – Fattie

2

、あなたが使用します。

- (void)setValue:(int)value 
{ 
    if (_value == value) return; 
    [self willChangeValueForKey:@"value"]; 
    _value = value; 
    [self didChangeValueForKey:@"value"]; 
} 

+ (BOOL)automaticallyNotifiesObserversOfValue { return NO; } 
+0

これは私の行うことです!それは、ここに文書化されています:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW1 – Klaas

+0

これは私が何をすべきかです、あまりにも。潜在的に多数の受信者間で繰り返しチェックを行うよりも、パフォーマンスと保守性が向上します。 –

関連する問題