Наблюдение за изменениями в изменяемом массиве с помощью KVO и NSNotificationCenter

В моей модели у меня есть массив объектов, называемых событиями. Я хотел бы, чтобы мой контроллер уведомлялся всякий раз, когда к событиям добавляется новый объект.

Я думал, что хорошим способом сделать это будет использование шаблона 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];

Странно ли сохранять ссылку на контроллер из делегата?

Я изо всех сил пытаюсь понять, как выбрать наилучший подход, поэтому буду очень признателен за любые советы по производительности, гибкости кода в будущем и лучшим практикам!

19
задан MathewS 3 May 2012 в 17:17
поделиться