0

我有一系列适用于我的应用程序的模型。在所有这些模型中,有(将有)大约 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)。

4

1 回答 1

0

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

于 2010-07-30T17:57:04.480 回答