我希望在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的内容?
发布于 2012-11-12 20:27:45
我希望NSCache
不会对这种类型的键兼容键值观察(KVO)。KVO是在NSObject
级别内部实现的,方法是将普通的设置器替换为警告相关观察者并调用原始设置器的设置器。在使用setObject:forKey:
进行设置的情况下,没有特定的设置器,因此运行时没有挂起的东西。
由于NSCache
不会发布任何相关的通知,我认为你最大的希望是the delegate protocol。它并不明确什么是驱逐,但如果在与键关联的对象被故意更改时调用cache:willEvictObject:
,那么您可以直接与之挂钩。
否则,我建议您为NSCache
创建一个包装类,比如DWCache
,它包含一个NSCache
,是缓存的委托,并提供自己的setObject:forKey:
。它将在(i)第一次调用setObject:forKey:时;(ii)每次后续调用提供与缓存中已有对象不同的对象时;(iii)每当它接收到cache:willEvictObject:
时,都会发布一条适当的消息。
唯一的潜在复杂性是NSCache
没有复制原始的键,并且在一定程度上没有从对象获取键的方法。您可能希望单独存储这些连接,例如通过NSDictionary
。如果你在缓存驱逐对象时清除了字典,你仍然会提供缓存行为。
发布于 2012-11-12 20:22:15
您必须实现此方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
keyPath是已更改的键,object是新值。
https://stackoverflow.com/questions/13350519
复制相似问题