5

をリファクタリング:KVOと私が持っているだとします

@property NSNumber* number; 

そして、私のコントローラが観測されています

- (void)observeValueForKeyPath:(NSString *)keyPath ... 
{ 
    if ([keyPath isEqualToString:@"number"]) ... 
} 

私の質問は - いただきましnumberプロパティの名前をリファクタリングするあなたのアプローチ?

オブザーバーコードで観測されたキーを更新する必要があるのは明らかですが、私はスマート/自動の方法でそれをどうやって行うことができますか?

+0

何をリファクタリングしますか?私は何かをする実際のコードを見ていない。 –

+0

申し訳ありませんが、私はプロパティの名前を変更し、観測されたkeyPathの名前を更新することを意味しました –

答えて

3

1つの方法は、観察されているすべてのプロパティの文字列定数を宣言することです。オブザーバを追加し、keypathを比較するには、これらの定数を使用します。プロパティの名前を変更するときはいつでも、これらの文字列定数の値を変更する必要があります。

私は完全な霧化が可能だとは思わない。

+0

ええ、私はそれについて考えていた、まだ要求しています;) –

+0

もう一つの方法は反射を使用することです。クラス内のプロパティの数とその順序が変更されないように固定されている場合は、特定のインデックスのプロパティにアクセスするようなランタイム関数の助けを借りることができます。 – Apurv

3

私は自分自身に反応します:)私の解決策はApurvソリューションとユニットテストの組み合わせです。

ここでそれは:MyClass各観察プロパティについて

を定義:- (void)observeValueForKeyPath:(NSString *)keyPath ...実装用途において

static NSString* MyClassPropertyNameNumber = @"number";

のみ定義NSStringsを。

- (void)observeValueForKeyPath:(NSString *)keyPath ... 
{ 
    if ([keyPath isEqualToString:MyClassPropertyNameNumber]) ... 
} 

MyClassのオブジェクトがsetNumber:numberセレクタに応答するかどうかをチェックするユニットテストを書きます。

- (void)testMyClass 
{ 
    SEL numberGetter = NSSelectorFromString(MyClassPropertyNameNumber); 
    SEL numberSetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:", MyClassPropertyNameNumber]); 

    MyClass* testMyClass = [[MyClass alloc] init]; 
    if (![testMyClass respondsToSelector:numberGetter] || ![testMyClass respondsToSelector:numberSetter]) 
    { 
     STFail(@"%@: %@ property name has changed! Please update your defined property name!", NSStringFromClass([MyClass class]), MyClassPropertyNameNumber); 
    } 
} 

プロパティ名を変更して、定義済みのプロパティ名を更新しないと失敗します。

私はそれが誰かのために役立つことを願っています:)

1

それぞれの変数を定義し、キーのパスを観察し、登録し、オブザーバーハンドラメソッドにする場合、コンテキストとしてそれらを使用します。

static void * numberKVO = &numberKVO; 
static void * letterKVO = &letterKVO; 

... 
[self addObserver:self 
     forKeyPath:@"kp.4.number" 
      options:NSKeyValueObservingOptionNew 
      context:numberKVO]; 
[self addObserver:self 
     forKeyPath:@"kp.4.letter" 
      options:NSKeyValueObservingOptionNew 
      context:letterKVO]; 
... 

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (context == numberKVO) { 
     ... 
    } else if (context == letterKVO) { 
     ... 
    } 
} 

あなたが変更することができます他のものを変更することなく、プロパティとキーパス。

0

Mogeneratorは、コアデータモデルクラスを扱う際の優れたツールです。これは、すべての属性、リレーションシップ、および取得されたプロパティのNSStringを生成します。

extern const struct ModelClassAttributes 
extern const struct ModelClassRelationships 
extern const struct ModelClassFetchedProperties 
関連する問題