我想在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是更改的键,对象是新值。