首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >键值观察NSCache

键值观察NSCache
EN

Stack Overflow用户
提问于 2012-11-13 03:50:51
回答 2查看 1.3K关注 0票数 3

我希望在NSCache实例中对应于某个键的对象发生变化时得到通知。我尝试过不走运地使用键值观察(控制台不记录任何内容)。

代码语言:javascript
复制
- (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的内容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-13 04: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。如果你在缓存驱逐对象时清除了字典,你仍然会提供缓存行为。

票数 6
EN

Stack Overflow用户

发布于 2012-11-13 04:22:15

您必须实现此方法:

代码语言:javascript
复制
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

keyPath是已更改的键,object是新值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13350519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档