В моей модели у меня есть массив объектов, называемых событиями. Я хотел бы, чтобы мой контроллер уведомлялся всякий раз, когда к событиям добавляется новый объект.
Я думал, что хорошим способом сделать это будет использование шаблона 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];
Странно ли сохранять ссылку на контроллер из делегата?
Я изо всех сил пытаюсь понять, как выбрать наилучший подход, поэтому буду очень признателен за любые советы по производительности, гибкости кода в будущем и лучшим практикам!