-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

您对键顺序的假设肯定是不正确的。an 中键的顺序NSDictionary未指定,索引 0 处的键和值不必是最旧的。您应将每个图像的创建日期存储在将它们放入缓存字典的方法中。

除此之外,其余代码似乎是有效的。

于 2013-01-01T12:06:58.797 回答