为所有型号iVars使用一个setter

时间:2010-07-30 17:51:31

标签: objective-c model-view-controller nsmutabledictionary getter-setter

我的应用程序有一系列模型。在所有这些模型中,有(或将是)大约200或300个实例变量。应用程序将其持久数据存储在基于Web的服务器上(MySQL - 但我想这部分并不重要)。每当模型iVar更新时,我需要调用服务器来更新该iVar的适当值。

我当前的模型策略是(头文件):

@interface MyModel : NSObject {

    NSString * firstName;
    NSString * lastName;
}

@property (readwrite, copy) NSString * firstName;
@property (readwrite, copy) NSString * lastName;

@end

(实施档案):

@implementation MyModel

@synthesize firstName;
@synthesize lastName;

-(id)init {

    [super init]

    [self setFirstName:@"George"];
    [self setLastName:@"Kastanza"];

    return self;
}

-(void)setFirstName:(NSString *)aName {

    // call method to update server with new value here
    firstName = aName;
}

-(void)setLastName:(NSString *)aName {

    // call method to update server with new value here
    lastName = aName;
}

@end

问题在于,如果我有200或300个iVar,则需要对服务器进行相同的更新调用,这意味着要编写批次的setter。此外,如果我需要对方法调用进行更改,我必须更新整个应用程序中每个setter中的每个方法。

是否有一个过程可以在设置之前先通过方法运行每一组iVar?

我想过每个模型对象只有一个NSMutableDictionary来存储所有的iVar,但这会抽象出setter和getter,并且可能会为很多字典带来很大的内存占用。但是,这样做意味着每次设置字典时我都可以通过一种方法传递它。

据我所知,动态地将iVar在运行时添加到对象模型被认为是一件坏事,因为指针引用了可能依赖于模型的任何子类(子类指针不会得到偏移,除非完整的重新编译是完成)。

非常感谢任何想法和建议。

更新

根据Ole的建议,这里是解决方案(尽管它使用的代码多于几行而不幸)...

在模型中我添加了一个我可以在需要时设置的方法。我没有直接从init调用该方法,因为添加从服务器返回的一大堆结果将触发添加的每个对象的观察者。所以我在之后调用方法我已经初始化并更新了服务器中的第一个抓取。

这是代码......

-(void)registerObservers {

    [self addObserver:self 
           forKeyPath:@"firstName"
              options:NSKeyValueObservingOptionNew 
              context:NULL];

    [self addObserver:self 
           forKeyPath:@"lastName" 
              options:NSKeyValueObservingOptionNew 
              context:NULL];
}

然后我将观察者添加到模型中:

-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context {

    if ([keyPath isEqual:@"firstName"]) {
        // Do whatever I need to do
    }

    if ([keyPath isEqual:@"lastName"]) {
        // Do whatever I need to do
    }
}

在我的实际实现中,我也碰巧发布了一个对象设置为self的通知,这样我就可以更新任何应该正在收听但没有注意的内容(比如NSArrayControllers中的内容)

1 个答案:

答案 0 :(得分:0)

使用Key-Value Observing。但是,您必须手动将自己注册为每个属性的观察者。