-1

iOS アプリにキャッシュを実装しています。これにより、画像が RAM にダウンロードされたままになります。

私はいくつかの調査を行い、いくつかのコードを見つけましたが、それらのほとんどは画像を永続的なストレージにキャッシュするためのものでした.

試してみNSCacheましたが、必要に応じて回避できませんでした。

要件は次のとおりです。

  • 画像保存の制限。例えば100。
  • キャッシュの制限に達すると、新しい画像を追加する前に、挿入された最も古い画像を削除する必要があります。

正確な言葉はわかりませんが、FIFO キャッシュ (先入れ先出し) と呼ぶべきだと思います。

いくつかの調査の後、次の実装を行いました。

static NSMutableDictionary *thumbnailImagesCache = nil;

+ (UIImage *)imageWithURL:(NSString *)_imageURL
{
    if (thumbnailImagesCache == nil) {
        thumbnailImagesCache = [NSMutableDictionary dictionary];
    }

    UIImage *image = nil;

    if ((image = [thumbnailImagesCache objectForKey:_imageURL])) {
        DLog(@"image found in Cache")
        return image;
    }

    /*  the image was not found in cache - object sending request for image is responsible to download image and save it to cache */
    DLog(@"image not found in cache")
    return nil;
}

+ (void)saveImageForURL:(UIImage *)_image URLString:(NSString *)_urlString
{
    if (thumbnailImagesCache == nil) {
        thumbnailImagesCache = [NSMutableDictionary dictionary];
    }

    if (_image && _urlString) {
        DLog(@"adding image to cache")

        if (thumbnailImagesCache.count > 100) {
            NSArray *keys = [thumbnailImagesCache allKeys];
            NSString *key0 = [keys objectAtIndex:0];
            [thumbnailImagesCache removeObjectForKey:key0];
        }

        [thumbnailImagesCache setObject:_image forKey:_urlString];
        DLog(@"images count in cache = %d", thumbnailImagesCache.count)
    }
}

問題は、これが正しい/効率的な解決策であるかどうかわからないことです。誰もがより良いアイデア/解決策を持っていますか?

4

1 に答える 1

2

キーの順序に関するあなたの仮定は確かに正しくありません。内のキーの順序NSDictionaryは指定されていません。インデックス 0 のキーと値が最も古いものである必要はありません。各画像の作成日をキャッシュ ディクショナリに配置するメソッドに保存する必要があります。

それとは別に、コードの残りの部分は有効なようです。

于 2013-01-01T12:06:58.797 に答える