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