每个键都符合NSMutableDictionary键值吗?

时间:2011-07-28 23:20:15

标签: objective-c nsdictionary key-value-observing

我需要在很多不同的键上设置一些观察者,我宁愿不要声明大约五十种不同的@properties,(因为我已经开始做了)所以我想知道NSDictionary是否可以为我做这一切?

更新

猜猜我应该更具体一点,我希望能够在NSMutableDictionary中设置任意键(NSStrings)的对象,然后在同一个字典中设置任意键的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 个答案:

答案 0 :(得分:2)

是的,确实如此。当使用setValue:forKey:

更改密钥时,正常的非子类NSMutableDictionary为订阅的任何NSString密钥提供KVO通知