3

私は現在15個のプロパティを持つ(そして成長している)クラスを持っており、それらのプロパティの1つが変更されるたびにupdateメソッドを呼び出さなければならないことに気づいています。

現在、私はすべてのセッターを次のようなコードでオーバーライドしています。

-(void)setParameterName:(NSUInteger)newValue {
  if (_param == newValue)
    return;
  _param = newValue;
  [self redraw];
}

ここで重要なのはメソッド[self redraw];です。

それを行うためのより良い方法はありますか?keyValueオブザーバー(メソッドobserveValue:forKeyPath:ofObject:change:context:)を使用する必要がありますか?

ノート:

  • すべてのプロパティ(これまでのところ)は(assignほとんど、、、enumおよびNSUInteger)です。CGFloatBOOL
  • これらのプロパティはすべて、バインディングを使用して設定されます(メソッドbind:toObject:withKeyPath:options:)。ファイルシステムからロードする場合を除きます(ロードが完了した後、すべてのオブジェクトで描画メソッドをすでに呼び出しているため、これは重要ではありません)。
  • 値の変更は、現在のオブジェクトに対してのみ行われます。他のオブジェクトに変更が発生したときに通知する必要はありません。
  • 他にも、変更を監視する必要のないプロパティがあります(出力に影響がなく、出力の描画に時間がかかるため)。

ありがとう!

4

2 に答える 2

2

これらのプロパティは を呼び出すバインディングを使用して更新されるため-setValue:forKey:、カスタム セッターを記述する代わりに、そのメソッドをオーバーライドできます。

+ (NSArray *) keysAffectingDrawing {
    static NSArray *singleton;
    if (!singleton)
        singleton = [NSArray arrayWithObjects:
                      @"property1",
                      @"property2",
                      @"property3",
                      nil];
    return singleton;
}

- (void) setValue:(id) value forKey:(NSString *) key {
    [super setValue:value forKey:key];
    if ([[CustomClass keysAffectingDrawing] containsObject:key]) [self redraw];
}

(最初はキー値の監視を推奨する傾向がありましたが、ここではそれが最善の解決策ではないことに同意します。その理由の一部は、オブジェクトが 1 つしかないことと、設計が MVC に従っていないことだと思います。通常、MVC では、 draws 自体は、すべてのプロパティを持つものではありません。)

(追加:ああ、なるほど。モデルはプロパティをビットマップにレンダリングする責任があり、-redrawそれが機能します。それは素晴らしい MVC です。より明確にするために、メソッドの名前を からor のよう-redrawなものに変更することをお勧めします。実際には何も描画しません。)-updateImage-renderImage

于 2012-06-12T04:41:48.173 に答える
1

Key-Valueオブザベーションを使用して 、すべてのプロパティでメソッド呼び出しを繰り返すことを回避できますが、セッターでメソッドを直接呼び出すことは間違った方法ではなく、さらに高速になる可能性があると思います...

于 2012-06-11T20:37:29.967 に答える