键值观察 NSCache.



我想在NSCache实例中与某个键对应的对象发生变化时收到通知。我尝试使用键值观察没有运气(控制台不记录任何内容)。

- (void)viewDidLoad
{
[super viewDidLoad];
[self.cache addObserver:self forKeyPath:@"myKey" options:NSKeyValueObservingOptionNew context:NULL];
[self.cache setObject:@"myObject" forKey:@"myKey"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"KEYPATH CHANGED: %@", keyPath);
}

如何观察NSCache的内容?

我希望NSCache不符合这种键的键值观察(KVO)。KVO 在NSObject级别内部实现,将普通的 setter 替换为一个提醒相关观察者并调用原始 setter 的 setter。对于您设置的东西setObject:forKey:没有特定的 setter,因此运行时不会挂起任何内容。

由于NSCache没有发布任何相关通知,我认为您最大的希望是委托协议。具体来说,什么算作逐出并不明确,但如果在故意更改与键关联的对象时调用cache:willEvictObject:,那么您可以直接将其挂钩。

否则,我建议您为NSCache创建一个包装类,例如DWCache为了参数起见,它包含一个NSCache,是缓存的委托,并提供自己的setObject:forKey:。它将在第一次调用 setObject:forKey:;(ii) 在每次后续调用时,提供的对象与缓存中已有的对象不同;以及 (iii) 每当收到cache:willEvictObject:时。

唯一潜在的复杂性是NSCache不会复制原始密钥,部分原因是无法从对象获取密钥。您可能希望单独存储这些连接,例如通过NSDictionary。如果在缓存逐出对象时清除字典,则仍将提供缓存行为。

你必须实现这个方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

keyPath是更改的键,对象是新值。

最新更新