iOS开发进阶-使用SDImageCache优化用户体验
2016-09-30 17:47
555 查看
SDWebImage的基本功能和使用这里不在一一介绍,网上有很多资料可以参考。本文主要讲解SDImageCache在实际开发中的一些体验优化,后续有新的优化思路和实际问题会继续补充。
这里的Key最后是使用url加一个标示,因为SDImage里面默认会把url作为键缓存一份下载的原图,为了不冲突最好使用自定义的键。
图片渲染结束后,从A调到B控制器之后,我在B控制器里面优先从缓存里面获取图片,如果获取不到图片,则下载图片并进行相应的处理,如果还是失败则使用UIer(美工。。)提前给的图片。
添加通知
不需要再做额外的操作,获取图片之后,图片就已经加载到了内存中了。然后像平时一样使用SDImageCache设置图片就可以了,SDImageCache就会优先从内存获取图片。
SDWebImage在实际开发中的优化
提前对图片进行预处理
需求是这样的,我在A控制器需要显示图片imageA,A控制器跳转到B控制器,在B控制器我需要显示ImageAA,ImageAA是对ImageA进行拉伸虚化处理之后的图片,一般开发的思维都是在B控制器中重新下载一份ImageA,然后对Image进行虚化拉伸处理。这样做一方面没有使用SDWebImageCache已经缓存的图片,另一方面,拉伸渲染图片会浪费很多的时间。解决该问题好的思路就是在A控制器中加载完图片之后在回调里面对图片进行虚化拉伸处理。然后以URL再加自定义的字符串拼接起来作为渲染图片的键,最后用SDimageCache把图片缓存起来。[self.avatarImageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"avatar_180x180"] options:SDWebImageLowPriority|SDWebImageRetryFailed|SDWebImageRefreshCached completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL){ if (image) { dispatch_async(dispatch_get_global_queue(0, 0), ^{ //提前渲染B控制器需要的图片 CGSize imageSize = image.size; CGSize size = CGSizeMake(SCREEN_WIDTH, imageSize.height * (SCREEN_WIDTH/imageSize.width)); UIImage *scaleImage = [[image imageCompressForSize:image targetSize:size] boxblurImageWithBlurRadius:30.f]; //缓存图片 NSString *key = [NSString stringWithFormat:@"%@%@",url,@"_scale"]; [[SDImageCache sharedImageCache] storeImage:scaleImage forKey:key toDisk:YES]; }); } }];
这里的Key最后是使用url加一个标示,因为SDImage里面默认会把url作为键缓存一份下载的原图,为了不冲突最好使用自定义的键。
图片渲染结束后,从A调到B控制器之后,我在B控制器里面优先从缓存里面获取图片,如果获取不到图片,则下载图片并进行相应的处理,如果还是失败则使用UIer(美工。。)提前给的图片。
dispatch_queue_t queue = dispatch_queue_create("liveImage_queue", DISPATCH_QUEUE_PRIORITY_DEFAULT); dispatch_async(queue, ^{ SDWebImageManager *manager = [SDWebImageManager sharedManager]; SDImageCache* cache = [SDImageCache sharedImageCache]; NSString* key = [manager cacheKeyForURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",url,@"_scale"]]]; UIImage *cacheImage = [cache imageFromDiskCacheForKey:key]; if (cacheImage) { dispatch_async_on_main_queue(^{ self.backgroundView.image = cacheImage; }); }else { [manager downloadImageWithURL:[NSURL URLWithString:loadingURL] options:SDWebImageLowPriority|SDWebImageRetryFailed|SDWebImageRefreshCached progress:NULL completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (image) { CGSize imageSize = image.size; CGSize size = CGSizeMake(SCREEN_WIDTH, imageSize.height * (SCREEN_WIDTH/imageSize.width)); self.backgroundView.image = [[image imageCompressForSize:image targetSize:size] boxblurImageWithBlurRadius:30.f]; } else { self.backgroundView.image = [UIImage imageNamed:@"default_image"]; } }]; } });
使用SDImageCache预加载缓存图到内存,避免屏幕闪烁
问题是这样的,在某个加载图片很多的页面,退出到后台后,再回到前台的时候,屏幕会有一个闪烁的效果。这是个体验的问题,不过作为一个追求完美的程序员,这怎么可以坐视不管呢。解决这个问题首先需要找到原因,了解SDImageCache原理的开发者应该能想到问题的一些原因。因为SDImage加载缓存的图片是优先从内存获取,然后从磁盘中获取,应用退到后台之后,应用所占内存被释放,所以应用回到前台的时候图片需要从磁盘读取,从磁盘读取图片比较缓慢,这就造成了显示的时候闪屏的效果。解决这个问题的思路是可以添加一个通知,在应用将要回到前台的时候,调用SDImageCache根据键把图片从磁盘加载到内存。这样在回到前台显示的时候,图片直接从内存中读取,就没有了闪屏的效果。添加通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becmeActive)name:UIApplicationDidBecomeActiveNotification object:nil];
-(void)becmeActive{ dispatch_async(dispatch_get_global_queue(0, 0), ^{ SDWebImageManager *manager = [SDWebImageManager sharedManager]; SDImageCache* cache = [SDImageCache sharedImageCache]; NSString* key = [manager cacheKeyForURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",url,@"_scale"]]]; UIImage *cacheImage = [cache imageFromDiskCacheForKey:key]; }); }
不需要再做额外的操作,获取图片之后,图片就已经加载到了内存中了。然后像平时一样使用SDImageCache设置图片就可以了,SDImageCache就会优先从内存获取图片。
SDWebImage在实际开发中的优化
相关文章推荐
- 使用SDImageCache优化用户体验
- iOS开发-进阶:最新版SDWebImage的使用
- iOS开发——SDWebImage框架使用详解
- iOS开发使用sdWebImage实现对tableView的cell加载图片淡入动画
- iOS开发- SDWebImage第三方基本使用
- iOS开发SDWebImage的基本使用
- iOS开发之SDWebImage的使用
- iOS开发网络篇 一一 SDWebImage框架的基本使用
- IOS开发中图片加载类库的使用 EGOImageLoader,SDWebImage
- iOS项目开发实战——使用SDWebImage库进行图片请求
- iOS开发 - SDWebImage使用(一个可管理远程图片加载的类库)
- 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片
- iOS开发——使用MBProgressHUD来增加用户体验(二)
- IOS学习之SDWebImage使用和优化
- 学习IOS开发项目篇--SDWebImage基本使用
- iOS开发中使用UITableView提高用户体验
- iOS开发——使用MBProgressHUD来增加用户体验
- IOS 开发 Cache文件夹缓存的清理封装(包括WebKit缓存/SDImageCache缓存),都提供了相应的接口.
- iOS开发中 - SDWebImage 的原理及使用流程
- iOS陆哥开发笔记(九) (SDWebImage简单使用)