Соответствует ли значение ключа NSMutableDictionary для каждого ключа? - PullRequest
2 голосов
/ 29 июля 2011

Мне нужно установить несколько наблюдателей на множество разных ключей, и я бы предпочел не объявлять около пятидесяти различных @properties (как я начал это делать), поэтому мне интересно, может ли NSDictionary сделать все это для меня?

Обновление

Думаю, я должен быть более конкретным, я хотел бы иметь возможность устанавливать объекты для произвольных ключей (NSStrings) в NSMutableDictionary, а затем registerObserver для произвольных ключей в том же словаре, независимо от того, был ли когда-либо установлен ключ в этом велении NSMutableDictionary работает таким образом "из коробки"? или мне нужно сделать контейнерный класс с переопределенным setValue: forKey:?

Обновление 2

Я собрал этот быстрый тест, и он выглядит многообещающе. Используя SenTestingKit здесь, чтобы проверить.

//My dictionary
NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];

//An object that does not respond to notifications, and will therefore throw exceptions
NSNumber * notKVOcompliant = [NSNumber numberWithInt:1];

//Adding that object as an observer...
[myDict addObserver:notKVOcompliant forKeyPath:@"five" options:NSKeyValueObservingOptionNew context:nil];

//causing a notification to fire, which causes an exception to throw.
STAssertThrows([myDict setObject:@"something" forKey:@"five"],@"Notification was not sent.");

//A control group, to make sure the exception is because of the specific observed key
STAssertNoThrow([myDict setObject:@"something" forKey:@"six"], @"Control group");

//and lastly a manufactured failure to make sure this test has run
STFail(@"Ensure this test is running");

Так что я запустил это, и похоже, что это действительно работает из коробки. NSNumber в качестве наблюдателя должен получать уведомление, которое заставляет его генерировать нераспознанное исключение селектора, что приводит к передаче STAssertThrows.

Другой ключ не имеет наблюдателей и, следовательно, не действует.

Ошибка STFail, что означает, что тест обязательно выполняется.

1 Ответ

2 голосов
/ 30 июля 2011

Да, это так.Обычный неподклассированный NSMutableDictionary доставляет уведомления KVO для любого ключа NSString, на который подписан, когда ключ изменяется с setValue:forKey:

...