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) に準拠していないと思います。NSObjectKVO は、通常のセッターを、関連するオブザーバーに警告し、元のセッターを呼び出すものに置き換えることによって、レベルで内部的に実装されます。設定したものの場合、setObject:forKey:特定のセッターがないため、ランタイムがハングアップすることはありません。

NSCache関連する通知を投稿しないので、あなたの最善の希望はデリゲートプロトコルだと思います。エビクションとしてカウントされるものは明確ではありませんがcache:willEvictObject:、キーに関連付けられたオブジェクトが意図的に変更されたときに呼び出された場合、それを直接フックできます。

NSCacheそれ以外の場合はDWCache、引数のためにNSCache、キャッシュのデリゲートであり、独自の を提供するを含む のラッパー クラスを作成することをお勧めしますsetObject:forKey:。setObject:forKey:; への最初の呼び出し時に、適切なメッセージ (i) を投稿します。(ii) キャッシュ内に既に存在するオブジェクトとは異なるオブジェクトを提供する後続の呼び出しごと。(iii) を受信するたびに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 に答える