3

我目前有一个具有 15 个属性(并且还在增长)的类,我发现每次这些属性中的一个发生更改时,我都必须调用一个更新方法。

目前,我正在用这样的代码覆盖每个 setter:

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

方法[self redraw];是这里的关键。

有更好的方法吗?我应该使用 keyValue 观察者(方法observeValue:forKeyPath:ofObject:change:context:)吗?

笔记:

  • 所有属性(到目前为止)都是assign(主要是enumNSUInteger和)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];
}

(我首先倾向于推荐键值观察,但同意这不是最好的解决方案。我认为部分原因是只有一个对象,部分原因是设计不遵循 MVC。通常在 MVC 中一个对象draws 本身并不是具有所有属性的那个。)

补充:啊,我明白了。模型负责将属性渲染到位图,这就是-redraw它的作用。这很好 MVC。为了更清楚,我建议将方法的名称从更改为-redraw类似-updateImageor -renderImage,因为它实际上并没有做任何绘图。)

于 2012-06-12T04:41:48.173 回答
1

您可以使用 键值观察来避免在所有属性设置器中重复方法调用,但是我认为直接在设置器中调用方法并不是错误的方法,甚至可以更快...

于 2012-06-11T20:37:29.967 回答