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

Что-то вроде этого предоставит Вам необработанный доступ к данным ресурсов и запускать Вас:

HRSRC res = ::FindResource(NULL, MAKEINTRESOURCE(MY_VERSION_ID), RT_VERSION);
DWORD size = ::SizeofResource(NULL, res);
HGLOBAL mem = ::LoadResource(NULL, res);
LPVOID raw_data = ::LockResource(mem);
...
::FreeResource(mem);
19
задан Stig Brautaset 9 July 2009 в 22:54
поделиться

2 ответа

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

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

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

6
ответ дан 30 November 2019 в 05:13
поделиться

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

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

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

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

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

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

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

6
ответ дан 30 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: