iphone - 键值观察NSCache

标签 iphone objective-c ios key-value-observing 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);
}

如何观察 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/

相关文章:

iphone - NSCountedSet - 获取集合中的项目数

iphone - 使用 block 排队动画

iphone - 在 UINavigationController 中如何调用父函数

ios - 异常类型: 00000020 and Crash thread 4 are related?

iphone - 如何检查用户输入的电话号码在 Objective c 中是否有效?

ios - 异步调用中的推特分享错误

ios - 按下时获取对 UIBarButtonItem 父 Controller 的引用

iOS 11 : "Unable to simultaneously satisfy constraints"

ios - 通过 HTTP 将 PDF SDK 流式传输到 iOS

ios - AVAudioPlayer 被释放,而键值观察者仍然在其中注册