Что-то вроде этого предоставит Вам необработанный доступ к данным ресурсов и запускать Вас:
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);
Интересная идея. Я не могу найти ничего многообещающего в NSDictionary или NSDictionaryController. Моим первым инстинктом было бы использовать композицию вокруг NSMutableDictionary и перехватывать вызовы setObject: forKey: (и, возможно, -removeObjectForKey :), чтобы уведомить подписчиков об изменениях.
Есть сообщение Какао с любовью о создании подкласса NSMutableDictionary это, вероятно, будет полезно, если вы выберете этот путь. Я также создал свои собственные подклассы NSMutableDictionary , и вы можете использовать открытый исходный код.
Вы можете разработать протокол наблюдателя, который мог бы указывать определенные ключи, которые должны отслеживаться. Не должно быть слишком много кода, но больше, чем у меня сейчас есть время написать.
Я успешно реализовал это сейчас, используя композицию вокруг 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 с нестроковыми ключами!