В моей модели есть массив объектов, называемых событиями. Я хотел бы, чтобы мой контроллер получал уведомления всякий раз, когда к событиям добавляется новый объект.
Я подумал, что хороший способ сделать это - использовать шаблон KVO, чтобы получать уведомления при изменении событий (при добавлении нового объекта).
// AppDelegate
// events is a NSMutableArray @property/@synthesize etc...
[appDelagate addObserver:self
forKeyPath:@"events"
options:NSKeyValueObservingOptionNew
context:NULL];
Но не был вызван метод ObservationValueForKeyPath, и я обнаружил, что массивы не совместимы с KVO :-(
Один из вариантов - запустить метод вручную, вызвав willChangeValueForKey для keyPath
// ViewController
[self willChangeValueForKey:@"events"];
[self.events addObject:event];
[self didChangeValueForKey:@"events"];
Но это кажется тяжелым, так как я, вероятно, также должен отслеживать состояние моего массива событий до и после, чтобы к нему можно было получить доступ из метода Наблюдать за значениемФорКейПас.
Один из подходов может заключаться в использовании стандартного массива (вместо изменяемого) и создании / установке нового экземпляра событий каждый раз, когда я хочу добавить новый объект, или я мог бы создать отдельное свойство, которое отслеживает, сколько элементов находится в изменяемый массив (хотелось бы, чтобы вы могли наблюдать @ "events.count").
Другой вариант - использовать NSNotificationCenter. Я также прочитал несколько ответов, в которых предлагается использовать блоки (но я не знаю, с чего начать).
Наконец, могу ли я сохранить экземпляр своего контроллера в своем делегате и просто отправить соответствующее сообщение?
// Delegate
[myController eventsDidChange];
Странно ли хранить ссылку на контроллер от делегата?
Я изо всех сил пытаюсь понять, как выбрать лучший подход для использования, поэтому я очень благодарен за любые советы по производительности, будущей гибкости кода и передовым практикам!