2012-11-21 3 views
16

私はプロパティ変更の通知を受け取るために登録するキー値の観測(KVO)、そしてどのように使用して満足している:私はアカウントオブジェクトのすべてのプロパティの変化を観察したい場合は、Key Value Observing - オブジェクトのすべてのプロパティを観察する方法?

[account addObserver:inspector 
      forKeyPath:@"openingBalance" 
      options:NSKeyValueObservingOptionNew 
       context:NULL]; 

しかし、どうすればこれを達成できますか?それぞれの物件ごとに通知を登録する必要がありますか?

答えて

17

オブジェクトのすべてのプロパティの変更を購読するための組み込み関数がないようです。

あなたは正確にプロパティが変更されていると、あなたのクラスを変更することができますが、他のプロパティ(+ keyPathsForValuesAffectingValueForKeyまたは+keyPathsForValuesAffecting<Key>メソッドを使用して)の変化を観察することにダミーのプロパティを追加することができた気にしない場合:

// .h. We don't care about the value of this property, it will be used only for KVO forwarding 
@property (nonatomic) int dummy; 

#import <objc/runtime.h> 
//.m 
+ (NSSet*) keyPathsForValuesAffectingDummy{ 

    NSMutableSet *result = [NSMutableSet set]; 

    unsigned int count; 
    objc_property_t *props = class_copyPropertyList([self class], &count); 

    for (int i = 0; i < count; ++i){ 
     const char *propName = property_getName(props[i]); 
     // Make sure "dummy" property does not affect itself 
     if (strcmp(propName, "dummy")) 
      [result addObject:[NSString stringWithUTF8String:propName]]; 
    } 

    free(props); 
    return result; 
} 

dummyのプロパティを確認すると、オブジェクトのプロパティが変更されるたびにKVO通知が届きます。

また、投稿されたコードのようにオブジェクト内のすべてのプロパティのリストを取得して、それぞれのループのKVO通知を購読することができます(プロパティ値をハードコードする必要がないため)必要ならばプロパティ名を変更します。

+4

これは間接的ですが、正しい方向に私を指摘しました。 class_copyPropertyList()とproperty_getname()は、最初に尋ねられたとおりに、すべてのプロパティに観測値を追加するのに十分です。 –

+0

上記のコードスニペットには何か更新がありますか? – fatuhoku

+0

プラス、これはNSManagedObjectsのために動作しますか? – fatuhoku

関連する問題