Как мне несколько просмотров посмотреть данные Синглтона? - PullRequest
0 голосов
/ 11 ноября 2011

Я создал класс Singleton. Несколько контроллеров представления будут получать данные из синглтона для своих представлений. Данные периодически обновляются.

Как настроить приложение таким образом, чтобы контроллеры представления наблюдали за синглтоном, чтобы увидеть, есть ли изменения в данных ... или синглтон отправляет сообщение на представление, если есть новые данные, относящиеся к этому представлению?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2011

Вы можете использовать NSNotificationCenter для публикации уведомлений всякий раз, когда данные синглтона изменяются (например, методы установки), и регистрировать любые связанные представления для получения уведомлений.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

1 голос
/ 12 ноября 2011

Я бы использовал наблюдение значения ключа . Он встроен, поэтому им легко воспользоваться.

  1. Если ваш класс источника данных уже использует свойства, все готово. Вот пример того, который делает:

    @interface Source : NSObject {}
    @property (nonatomic, retain) NSString *value;
    @end
    
    @implementation Source
    @synthesize value;
    @end
    

    Если это не так, вам нужно определить только пару специально названных методов, чтобы заставить его работать:

    - (NSDictionary*)someValue;
    - (void)setSomeValue: (NSDictionary*)newValue;
    

    (где someValue - имя вашего свойства, а NSDictionary* - его тип. SetSomeValue не обязательно должен быть публичным методом).

    Если свойство вычисляется (так что для него нецелесообразно иметь установщик), вы можете вручную запускать уведомления KVO следующим образом:

    [self willChangeValueForKey:@"someValue"];
    // Do work with changes the effective value of someValue
    [self didChangeValueForKey:@"someValue"];
    
  2. Затем любой объект может подписаться на уведомления при смене ключа, например:

    @implementation Observer
    - (id)initWithSource: (Source *)source
    {
        if ([super init]) {
            _source = source;
            [_source addObserver:self forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL];
        }
        return self;
    }
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        NSLog(@"New value: %@", [change objectForKey:NSKeyValueChangeNewKey]);
    }
    - (void)dealloc
    {
        [_source removeObserver:self forKeyPath:@"value"];
        [super dealloc];
    }
    @end
    

    Ваш наблюдатель должен реализовать метод observeValueForKeyPath:ofObject:change:context:, который будет вызываться при изменении любого наблюдаемого ключа на любом наблюдаемом объекте. Вы можете узнать, что изменилось, посмотрев аргументы, переданные в ofObject: и KeyPath:.

  3. Измените некоторые значения! Вот как процесс будет работать с этими примерами классов:

    Source *source = [Source new];
    [(Observer*)[Observer alloc] initWithSource: source];
    source.value = @"foo";
    

    Вы увидите это на консоли, зарегистрированной как observer:

    New value: foo

Кодирование значения ключа и Наблюдение значения ключа руководства по программированию довольно хороши. Я также хотел бы взглянуть на справку по протоколу NSKeyValueObserving .

1 голос
/ 11 ноября 2011

Создайте протокол с некоторыми методами и добавьте этих слушателей (они должны реализовать протокол) в массив.Если вы что-то изменили в своем синглтоне, просто вызовите этот метод для всех слушателей.

Например:

@protocoll SingletonListenerProtocol
- (void)singleton:(Singleton*)singleton didChangeValueX:(NSString*)newValue;  
@end


-------------------

@implementation Singleton
- (void)setValueX:(NSString*)newX {
  valueX = newX;
  for(id<SingletonListenerProtocol> listener in listeners) {
    [listener singleton:self didChangeValueX:newX];
  }
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...