需要使用缓冲区保存和检索UIImages

6
我的应用程序是一种图片库。每当用户在库中点击图标时,需要显示图片(横向2张,纵向1张)。图片可能超过100张。我通常会使用原始文件并将其解码为UIImage格式。如果用户想要查看另一张图片,由于解码的原因,它需要一些时间(延迟)才能显示图片。因此,我希望在单独的线程(GCD)中将一些图片保存到缓存(NSArray)中以解决这个问题。
在数组中,我可以存储5到10张图片。每当用户滑动时都需要更新。
请提供建议。
提前感谢。

你应该使用NSCache来进行内存缓存,或者也可以考虑使用磁盘缓存的解决方案。对于图像,有很多缓存实现可供选择。 - pronebird
谢谢Andy。我会做同样的事情。如果可能的话,请提供一些参考链接。 - Kiran Kumar
@Andy 再次感谢。我按照你的建议实现了 NSCache,它运行良好。 - Kiran Kumar
太棒了,非常简单对吧?! - pronebird
是的。可以轻松实现。 - Kiran Kumar
3个回答

3
我已经使用GCD实现了NSCache。
dispatch_async(dispatch_get_global_queue(0, 0), ^{

    [self storeInCache];

       dispatch_async(dispatch_get_main_queue(), ^{

          UIImage *image=[_imageCache objectForKey:@"P5"];
          self.imageView = [[UIImageView alloc] initWithImage:image];
          self.imageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size};
          [self.scrollView addSubview:self.imageView];
          self.scrollView.contentSize = image.size;
     });
       });

// 将5张图片存储到NSCache中

-(void)storeInCache
{

UIImage *image = [UIImage imageNamed:@"photo1.png"];
[_imageCache setObject:image forKey:@"P1"];

UIImage *image2 = [UIImage imageNamed:@"photo2.png"];
[_imageCache setObject:image2 forKey:@"P2"];

UIImage *image3 = [UIImage imageNamed:@"photo3.png"];
[_imageCache setObject:image3 forKey:@"P3"];

UIImage *image4 = [UIImage imageNamed:@"photo4.png"];
[_imageCache setObject:image4 forKey:@"P4"];

UIImage *image5 = [UIImage imageNamed:@"photo5.png"];
[_imageCache setObject:image5 forKey:@"P5"];

}


2

试一下这个 -


    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)延迟不是在下载时,而是在解码(将其他格式转换为UIImage格式)时。2)对于imageCache,哪个更好(NSArray或NSMutable Array或其他任何一个)? - Kiran Kumar

0

你可以使用苹果的LazyTableImages

这段代码将在后台下载图像,并在下载完成后设置到imageview中。您可以添加占位符图像,直到您的原始图像正在下载过程中。

我在许多应用程序中使用了这个示例,所以如果需要,我也可以帮助您实现。

希望这能帮到你。


1
谢谢你的保证,兄弟。这适用于高分辨率图像吗? - Kiran Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接