缓存以保存动态内存iphone中的图像

时间:2013-01-01 11:59:40

标签: iphone objective-c ios

我在我的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)
    }
}

现在的问题是,我不确定天气这是正确/有效的解决方案。任何人都有更好的想法/解决方案吗?

1 个答案:

答案 0 :(得分:2)

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

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