Мне нужно установить несколько наблюдателей на множество разных ключей, и я бы предпочел не объявлять около пятидесяти различных @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, что означает, что тест обязательно выполняется.