У меня есть серия моделей для моего приложения. Во всех этих моделях есть (будет) около 200 или 300 переменных экземпляра. Приложение хранит свои постоянные данные на веб-сервере (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 должны пройти через один и тот же вызов обновления на сервере, что означает написание lot сеттеров. Более того, если мне нужно внести изменения в вызов метода, мне придется обновить каждый метод в каждом установщике во всем приложении.
Есть ли процесс, с помощью которого я мог бы запустить каждый набор iVar с помощью метода, прежде чем устанавливать?
Я думал, что для хранения всех iVar'ов нужно всего NSMutableDictionary
на каждый объект модели, но это абстрагирует сеттеры и геттеры и может привести к большим объемам памяти для стольких словарей. Тем не менее, выполнение этого означает, что каждый раз, когда устанавливается словарь, я могу передать его одним методом.
Насколько я понимаю, динамическое добавление iVar во время выполнения к объектной модели считается плохой вещью из-за ссылки на указатель для любых подклассов, которые могут зависеть от модели (указатель подкласса не получает смещение, если не выполняется полная перекомпиляция сделано).
Любые идеи и предложения приветствуются.
Обновление
Основываясь на рекомендациях Оле, вот решение (хотя, к сожалению, оно использует немного больше кода, чем несколько строк) ...
В модели я добавил метод, который я могу установить, когда мне нужно. Я не вызывал метод непосредственно из 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
).