Наблюдение за изменениями NSMutableDictionary

Можно ли наблюдать (подписаться) изменения в значениях, хранящихся под разными ключами в NSMutableDictionary? В моем случае ключи уже существуют, когда подписка инициируется, но значения меняются, и я хотел бы получить уведомление в этом случае. Я хотел бы ключ измененного значения в уведомлении.

Я предполагаю, что если бы все мои словарные ключи были экземплярами NSString, я мог бы просто подписаться на каждый путь ключа индивидуально. Но что, если мои ключи не являются строками? Мне не повезло в этом случае?

Ответы на вопрос(2)

Я успешно реализовал это сейчас, используя композицию вокруг NSMutableDictionary. Я удивлен, как мало кода потребовалось. Класс, который я реализовал, это Board, используемый для представления модели в настольной игре. Любой может подписаться на изменения для состояний платы, вызвав метод addObserver:, реализованный следующим образом:

- (void)addObserver:(id)observer {
    for (id key in grid)
        [self addObserver:observer
               forKeyPath:[key description]
                  options:0
                  context:key];
}

Поскольку вы можете подписаться только на ключи, используя модель KVO, я обманул и подписался наdescription ключа, но передавая сам ключ как контекст. В объектах, которые наблюдают экземпляры моего совета, я реализую-observeValueForKeyPath:ofObject:change:context: игнорировать строку keyPath и просто использовать переданный контекст.

Мой простой класс Board не совместим с KVO для искусственных свойств, которые я создаю с помощью этого метода, поэтому я прошел0 вoptions свойство, поэтому механизм КВО не будет пытаться получить старые / новые значения этих ключей. Это может привести к взрыву моего кода.

Все, что меняет доску (в моем простом классе есть только один метод, который делает это) вызывает необходимые уведомления, чтобы заставить механизм KVO вступить в действие:

- (void)setPiece:(id)piece atLocation:(Location*)loc {
    [self willChangeValueForKey:[loc description]];
    [grid setObject:piece forKey:loc];
    [self didChangeValueForKey:[loc description]];
}

Вуаля! Подписка на NSMutableDictionary с нестроковыми ключами!

 16 июл. 2012 г., 07:15
Подписка на описание это хороший трюк!
Решение Вопроса

Это интересная идея. Я не могу найти ничего в NSDictionary или NSDictionaryController, которое выглядит многообещающим. Моим первым инстинктом было бы использовать композицию вокруг NSMutableDictionary и перехватывать вызовы setObject: forKey: (и, возможно, -removeObjectForKey :), чтобы уведомлять подписчиков об изменениях.

Там естьКакао с любовью пост на подклассы NSMutableDictionary, который, вероятно, будет полезен, если вы решите пойти по этому пути. у меня тоже естьсоздал мои собственные подклассы NSMutableDictionaryи вы можете использовать код с открытым исходным кодом.

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

 Stig Brautaset10 июл. 2009 г., 08:52
Благодарю. Я думаю, что композиция вокруг NSMutableDictionary это путь. Я все еще не могу понять, как заставить это работать, если ключи не являются NSStrings, но я думаю, что я, вероятно, смогу с этим работать.
 10 авг. 2012 г., 11:13
@Quinn Taylor: ссылка на ваш пользовательский подкласс кажется мертвой, и мне нужно проверить этот код. У вас все еще есть где-нибудь?

Ваш ответ на вопрос