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