Использование одного сеттера для всех моделей iVars - PullRequest
0 голосов
/ 30 июля 2010

У меня есть серия моделей для моего приложения. Во всех этих моделях есть (будет) около 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).

1 Ответ

0 голосов
/ 30 июля 2010

Использование Наблюдение значения ключа .Вы должны вручную зарегистрировать себя в качестве наблюдателя для каждого объекта недвижимости.

...