2015-04-08 26 views
6

我的应用程序是一种图片库。当用户点击图库中的图标时,需要显示图像(横向2图像,纵向1图像)。图片可能超过100张。我通常采用原始文件并将其解码为UIImage格式。如果用户想要看到另一个图像,则需要一些时间(延迟)来显示图像,因为它们是解码的。所以我想要保存一些图像到缓存(NSArray)在一个单独的线程(GCD)来解决这个问题。需要使用缓冲区保存和检索UIImages

在数组中,我可能会存储5到10个图像。每次用户滑动时都需要更新。

请给出建议。

在此先感谢。

+0

您应该使用NSCache用于内存缓存,或查看解决方案ns也有磁盘缓存。有很多图像的缓存实现。 – Andy

+0

谢谢安迪。我也会这样做。如果可能,请提供一些链接以供参考。 –

+0

@安迪再次感谢。按照您的建议实施NSCache。它工作正常。 –

回答

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]; 
} 
+0

感谢您的答复兄弟。 1)延迟不是下载而是解码(其他格式为UIImage格式)。 2)对于imageCache哪一个是好的(NSArray或NSMutable Array或任何其他) –

0

您可以使用Apple的LazyTableImages

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

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

希望这会帮助你。

+1

感谢您的保证兄弟。它适用于高分辨率图像吗? –

3

我一直在使用GCD

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; 
    }); 
     }); 

//商店实现NSCache 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"]; 

}