如何使用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
获取 x
和 y
并使用 frame
来获取获取width
和height
)。然后,您可以遍历图像视图并删除任何 CGRectIntersectsRect
与可见矩形和图像视图 frame
不匹配的内容。但我个人认为完成所有这些工作很疯狂。使用UICollectionView
(它会为您执行此操作)并找出您遇到内存问题的原因。以上是关于如何使用objective-c将图像存储在缓存中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用objective-c从CloudKit中的资产字段中检索图像
如何将url图像存储在缓存中,然后在iphone的imageview中显示