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