我想在 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
没有发布任何相关通知,我认为您最好的希望是 the delegate protocol .什么算作逐出并不明确,但如果在与键关联的对象有意更改时调用 cache:willEvictObject:
,那么您可以直接 Hook 它。
否则,我建议您为 NSCache
创建一个包装类,例如 DWCache
为了论证,它包含一个 NSCache
,是代理缓存,并提供自己的 setObject:forKey:
。它将在第一次调用 setObject:forKey: 时发布适当的消息 (i); (ii) 每次后续调用都提供与缓存中已有对象不同的对象; (iii) 每当它收到 cache:willEvictObject:
时。
唯一潜在的复杂性是 NSCache
不复制原始 key ,部分结果是无法从对象中获取 key 。您可能希望单独存储这些连接,例如通过 NSDictionary
。如果您在缓存逐出对象时清除字典,您仍将提供缓存行为。
关于iphone - 键值观察NSCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13350519/