ios:图像缓存和检索

时间:2014-04-17 12:26:02

标签: ios caching

我希望在iOS中为图像实现缓存功能。 我想为此创建一个示例应用程序,仅供我理解。

这是我想要做的:

  • 从互联网上获取高分辨率图像并对其进行缓存,然后显示它。

  • 现在,下次ViewController加载时,图像应该从缓存加载,而不是从互联网加载。

我知道如何使用SDWebImage框架缓存图像。我希望尝试使用NSCache。

如何使用NSCache实现它?欢迎举例。

已编辑:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSCache *cache = [self imageCache];

    NSURL *url = [NSURL URLWithString:@"http://i1.ytimg.com/vi/YbT0xy_Jai0/maxresdefault.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [[UIImage alloc] initWithData:data];

    NSString *imagePath = @"http://i1.ytimg.com/vi/YbT0xy_Jai0/maxresdefault.jpg";
//    UIImage *image;
    if (!(image = [cache objectForKey:imagePath])) { // always goes inside condition
        // Cache miss, recreate image
        image = [[UIImage alloc] initWithData:data];
        if (image) {    // Insert image in cache
            [cache setObject:image forKey:imagePath]; // cache is always nil
        }
    }
    _imgCache.image = image;

2 个答案:

答案 0 :(得分:5)

您可以使用和Id:

将图像添加到缓存
[imageCache setObject:image forKey:@"myImage"];

稍后您可以使用以下方法检索图像:

UIImage *image = [imageCache objectForKey:@"myImage"];

整个流程将如下:

UIImage *image = [imageCache objectForKey:@"myImage"];
if (!image)
{
   // download image
   dispatch_async(dispatch_get_global_queue(0, 0), ^{
       NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:yourURL]];
       if (imageData)
       {
           // Set image to cache
           [imageCache setObject: [UIImage imageWithData:imageData] forKey:@"myImage"];
           dispatch_async(dispatch_get_main_queue(), ^{
               [yourImageView setImage:[UIImage imageWithData:imageData]];
           });
        }
    });
}
else
{
   // Use image from cache
   [yourImageView setImage:image];
}

答案 1 :(得分:0)

请参阅示例代码以异步加载图像和图像缓存,

https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html