如何使用objective-c将图像存储在缓存中

Posted

技术标签:

【中文标题】如何使用objective-c将图像存储在缓存中【英文标题】:How can I store images in cache memory using objective-c 【发布时间】:2015-07-29 12:54:43 【问题描述】:

我在滚动视图(照片库)中显示多个图像时遇到问题。 我已从文档目录中获取图像。当我显示超过 100 张图像时应用程序崩溃。所以我想将图像存储在缓存中。

我想显示前 15 张图像,然后显示缓存中的其他图像。当我滚动 scrollview 时,将显示缓存中的前 15 个,然后将显示下一个。

要求是在scrollview 中显示图像,而不是在collectionView 或其他组件中。

files 是从文档目录中提取的图像路径的 array

我已获取所有图像路径并存储在files array

int x=2,y=5;
for (int i = 0; i < files.count ; i++)
 
   if(x<=308)
    
       NSString *setPath=[NSString stringWithFormat:@"%@/%@",filePath,[files objectAtIndex:i]];
       UIImage* imagePath = [UIImage imageWithContentsOfFile:setPath];
       imgView=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 77, 75)];
       imgView.image=imagePath; 
       x+=80;
    
    else
    
        x=2;
        y+=77;

        NSString *setPath=[NSString stringWithFormat:@"%@/%@",filePath,[files objectAtIndex:i]];
        UIImage* imagePath = [UIImage imageWithContentsOfFile:setPath];
        imgView=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 77, 75)];
        imgView.image=imagePath;
        x+=80;
    
        [gallaryScrollView addSubview:imgView];
        [self.view addSubview:gallaryScrollView];
         gallaryScrollView.contentSize=CGSizeMake(320, y+120);
 

【问题讨论】:

你使用SDWebImage库github.com/rs/SDWebImage。 @DharmeshDhorajiya - 我同意如果您需要从 Web 服务异步加载图像并享受缓存,SDWebImage 是一个很棒的工具。但我认为这里的问题更为根本,与其说是缓存问题,不如说是“滚动到视野之外时延迟加载和释放”的问题。而 SDWebImage 并没有解决这个问题。 Ravi - 你为什么不想使用集合视图(它只是一个滚动视图,它会自动处理困扰你当前设计的内存问题)?当然,您可以编写 UIScrollViewDelegate 方法在图像视图滚动进出视图时添加和删除它们,但您为什么要这样做? @Rob - 我同意你的建议,但是当超过 100 张图像时,集合视图崩溃应用程序中会出现同样的问题。 好的,然后解决这个问题。可能存在以下两个问题之一:首先,您可能持有UIImage 对象(例如,将它们保存在某个集合中)。你不想那样做。当一个单元被重用时,您要确保丢弃以前与该单元关联的UIImage 对象。不要将图像保存在内存中。其次,您可能正在使用高分辨率的图像:例如如果您将 4,000 x 4,000 像素的图像加载到 100x100 图像视图中,则每个图像仍将占用 64mb,除非您手动将图像大小调整为适合单元格的大小。 【参考方案1】:

缓存不会解决您的内存问题。 (如果有的话,使用额外的内存缓存只会给应用程序带来更多的内存压力。)您使用缓存是出于性能原因,而不是为了减少内存使用量。

问题是您正试图将图像视图加载到前面的滚动视图中。我建议对图像视图及其相关图像进行延迟加载。而不是分批 15 个(或其他),我建议在您的 UIScrollViewDelegate 方法中动态地执行它:

为滚动视图设置delegate

实现scrollViewDidScroll,它将:

从滚动视图中删除不可见(或至少不可见)的所有图像视图

添加任何滚动到视图中的图像视图并设置其image 属性

如果您出于性能原因想将此与 NSCache 结合使用缓存,您可以根据需要这样做,但我建议您首先关注主要的手动滚动视图委托实现。

【讨论】:

感谢 Rob 的建议。我是 iPhone 的新手,我不知道如何实施。如果有任何演示,请帮助我。 我不知道如何在滚动时删除或添加 imageView。 首先,您必须获取 CGRect 才能看到滚动视图的哪一部分(例如,使用 contentOffset 获取 xy 并使用 frame 来获取获取widthheight)。然后,您可以遍历图像视图并删除任何 CGRectIntersectsRect 与可见矩形和图像视图 frame 不匹配的内容。但我个人认为完成所有这些工作很疯狂。使用UICollectionView(它会为您执行此操作)并找出您遇到内存问题的原因。

以上是关于如何使用objective-c将图像存储在缓存中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用objective-c从CloudKit中的资产字段中检索图像

如何将url图像存储在缓存中,然后在iphone的imageview中显示

如何在颤动中将资产图像存储在缓存中

如何事先获取将存储在 Android/Java 缓存中的未来 Glide 图像大小?

如何在angularjs中将图像存储到浏览器缓存中

如何在android中缓存图像? [复制]