0

私は NSCache の概念を理解しようとしていますが、NSCache インスタンスは、以前に保存したキーに値を返すことを保証していないということです。現時点でパフォーマンスの方が重要であると判断した場合は、キーと値のペアを追加しようとしても保存しない場合があります。

それが意味することは、私にとって次のことです。

  1. 各キーは、必要に応じて値を生成するのに十分な情報を「保持」する必要があります
  2. したがって、NSCache の各クエリは、基本的にキーの形式であり、対応する値を生成するために必要なすべての情報をラップする必要があります。
  3. 上記の 2 つの点から、NSCache は、キーと値の間のあらゆる種類の関連付けを確立する目的には役立たないと言えます。ユーザーはキャッシュとは無関係に値を生成できなければならず、NSCache を使用する唯一の目的はそれではありません。いくつかの値を「検索」するのではなく、メモリを交換してパフォーマンスを向上させるだけです

だから私の問題は、画像の透明マスクを保存することです。最初は、画像の名前をキーとして使用するだけでよいと考えていましたが、上記の推論からすると、それだけでは十分ではないようです。マスクの生成に使用される他のすべてのパラメーター (透明度のしきい値など) も含める必要があります。また、キャッシュにマスクを要求するたびに、すべてのパラメーターを提供する必要があることも意味します。そして、それを行うことについて私が考えることができる唯一の方法は、次のようなものNSInvocationをキーとして使用することです。しかし、それはかなり不格好な解決策のようです。

4

2 に答える 2

0

これについてさらに考えてみると、1 つ間違っていると思います。NSCache のキーは、値を生成するためのすべての情報を必ずしも保持する必要はありません。NSCache のキーは、値を検索するための一意の識別子である NSDictionary と同じ目的を果たすことができます。ただし、唯一の違いは、以前に追加したキーと値のペアが破棄された場合に備えて、NSCache のバックアップ プラン B が常に必要になることです。

簡単に言うと、2 つの異なるクラスに対する操作は次のようになります。

NSDictionary

  1. V各キーの各値を生成Kし、ペアを辞書に追加します
  2. Vを使って調べるK

NSキャッシュ

  1. Vを使って調べるK
  2. の場合V == nil、値Vを生成し、ペアをキャッシュに追加します

したがって、ほぼすべての NSDictionary を NSCache に変換することは可能ですが、変換後は NSCache を渡すことができません。常に値を生成する方法を知っておく必要があるため、NSCache インスタンスはおそらくプライベート プロパティになります。特定のクラスでのみ使用されます。

私の問題については、このようなメソッドを使用することを解決しました ( selfNSCache のサブクラスを指していると思われますが、まだテストしていません)。

- (Mask *) maskForImageName:(NSString *)name maskGenerator:(Mask *(^)(NSString *))generator {
    Mask *mask = [self objectForKey:name];
    if (!mask) {
        mask = generator(name);
        [self setObject:mask forKey:name];
    }
    return mask;
}

object-c が関数型の遅延スタイルの言語である場合は、さらに単純化されます。その場合、ジェネレーターをブロックでラップする必要さえありません。しかし、今のところこのソリューションに満足しています。実際、このパターンはほとんどの場合 NSCache で使用されると思うので、NSCache のカテゴリとして追加します。

于 2013-06-25T18:39:23.690 に答える