之前我们已经在多线程基础中,通过把图片的网络请求放到非主线程中,来优化了整个app的卡顿情况。但是,这并不是最优解,因为当我们滑动页面的时候,图片并没有被保存下来,每次显示相同的图片,仍然要从网络中请求并加载。
进一步的优化是应该把初次请求的图片保存在缓存中,下一次显示的时候直接从缓存中读取,由于读取缓存的速度肯定大大小于网络请求的速度,所以通过把图片存储下来,可以进一步优化app的流畅性。接下来我们就介绍下在ios开发中图片存储的方案和流程。
同样的,这里我们介绍一个开源框架–SDWebImage来实现图片的请求和存储。
使用SDWebImage开源框架请求图片和存储
SDWebImage的下载和包含到工程文件的操作我们可以使用cocoaPods来集成。具体操作可以参考我之前介绍的一篇文章:
cocoaPods集成AFNetWorking开源框架
//方法三:使用GCD实现
// dispatch_queue_global_t downoadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //获取非主队列
// dispatch_queue_main_t mainQueue = dispatch_get_main_queue(); //获取主队列
// //在非主队列中,异步执行,执行获取图片的高耗时操作
// //异步:打开了多道门,可以同时穿过门(多线程)
// dispatch_async(downoadQueue, ^{
// UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:item.picUrl]]];
// dispatch_async(mainQueue, ^{
// //在主线程中执行UI操作,异步执行
// self.rightimageView.image = image; //UI操作必须在主线程中执行,否则会报警
// });
// });
//使用开源框架SDWebImage实现
//这里在第一次请求后直接将图片保存在缓存中,执行完毕后保存在磁盘里,下一次运行直接从磁盘加载到缓存中,优化了图片加载的速度
[self.rightimageView sd_setImageWithURL: [NSURL URLWithString:item.picUrl]
completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
NSLog(@""); //回调,请求流程结束后执行该回调
}];
上面的代码展示了使用SDWebImage框架实现图片的请求和存储。通过使用SDWebImage,不仅仅优化了app的流畅性,而且我们只需要传入URL就可以完成所有操作,也让我们的编码变得更加简单。
其它开源框架:
FastImageCache:FastImageCache是在SDWebImage的基础上进一步优化了图片的存储方案,它使用了MMap(一种内存文件映射的方法)进一步优化了存储方案。
LKImageKit:它也做了一些针对性的优化。
整个图片的加载就涉及到了网络、存储、多线程的应用。