Я успешно реализовал это сейчас, используя композицию вокруг NSMutableDictionary. Я удивлен, как мало кода он принял. Я реализовал класс, который используется для представления модели в настольной игре. Любой пользователь может подписаться на изменения на борту государств, вызвав addObserver: метод реализован так:
- (void)addObserver:(id)observer {
for (id key in grid)
[self addObserver:observer
forKeyPath:[key description]
options:0
context:key];
}
Так как вы можете подписаться только к ключам с использованием модели Кво, я обманул и подписался на описание ключа , но передавая сам ключ как контекст. В объектах, которые наблюдают экземпляры моего Совета, я реализую -observeValueForKeyPath:ofObject:change:context:
, чтобы игнорировать строку keyPath и просто использовать контекст переданный.
Мой простой класс платы не соответствует требованиям 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 с нестрочными ключами!
Спасибо. Я думаю, что композиция вокруг NSMutableDictionary - это путь. Я до сих пор не могу понять, как сделать эту работу, если только ключи не являются NSStrings, но я думаю, что, возможно, я смогу с этим справиться. –
@Quinn Taylor: ссылка на ваш пользовательский подкласс кажется мертвой, и мне нужно будет проверить этот код. Вы все еще там где-то висели? – Cyrille