我需要在很多不同的键上设置一些观察者,我宁愿不要声明大约五十种不同的@properties,(因为我已经开始做了)所以我想知道NSDictionary是否可以为我做这一切?
猜猜我应该更具体一点,我希望能够在NSMutableDictionary中设置任意键(NSStrings)的对象,然后在同一个字典中设置任意键的registerObserver,无论之前是否设置了键在那个词典中。 NSMutableDictionary是否以“开箱即用”的方式工作?或者我是否需要使用重写的setValue创建容器类:forKey:?
我把这个快速测试放在一起,看起来很有希望。在这里使用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失败,这意味着测试肯定正在运行。
答案 0 :(得分:2)
是的,确实如此。当使用setValue:forKey: