4

我想在与 NSCache 实例中的某个键对应的对象发生更改时得到通知。我试过使用 Key-Value Observing 没有运气(控制台不记录任何内容)。

- (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 的内容?

4

2 回答 2

6

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

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

否则NSCache,我建议您DWCache为. 它将在第一次调用 setObject:forKey:; 时发布适当的消息 (i) (ii) 每次后续调用提供的对象与缓存中已有的对象不同;(iii) 每当它收到一个.NSCachesetObject:forKey:cache:willEvictObject:

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

于 2012-11-12T20:27:45.230 回答
0

你必须实现这个方法:

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

keyPath 是改变的键,object 是新的值。

于 2012-11-12T20:22:14.823 回答