键值观察NSCache

dat*_*elk 3 iphone objective-c key-value-observing ios 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);
}
Run Code Online (Sandbox Code Playgroud)

如何观察NSCache的内容?

Tom*_*mmy 6

我希望NSCache这种密钥不会符合键值观察(KVO).KVO在该NSObject级别内部实施,将普通的setter替换为警告相关观察者并调用原始setter的人.对于您设置的内容,setObject:forKey:没有特定的setter,因此运行时无需挂起.

由于NSCache不发布任何相关通知,我认为您最好的希望是委托协议.它并不明确究竟什么算作驱逐,但如果cache:willEvictObject:在与关键字关联的对象有意更改时调用,则可以直接挂钩.

否则我建议你创建一个包装类NSCache,比如说DWCache为了参数,包含一个NSCache,是缓存的委托,并提供它自己的setObject:forKey:.它将在第一次调用setObject时发布适当的消息(i):forKey:; (ii)在每次后续呼叫中提供与缓存中已有的对象不同的对象; (iii)收到的时候cache:willEvictObject:.

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