SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高。但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage。
使用场景:自定义的UITableViewCell上有图片需要显示,要求网络网络状态为WiFi时,显示图片高清图;网络状态为蜂窝移动网络时,显示图片缩略图。如下图样例:
![](http://file.zhishichong.com/images/article/20161028/3e23ea67bf87c9a84e9222179702790e.png)
图中显示的图片符合根据网络状态下载要求
- 由于要监听网络状态,在这里笔者推荐使用AFNetWorking。
- 在GitHub或者利用cocoaPod给项目导入第三方框架AFNetWorking。
- 在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中监听网络状态。
12345678910111213141516// AppDelegate.m 文件中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{// 监控网络状态[[AFNetworkReachabilityManager sharedManager] startMonitoring];}// 以下代码在需要监听网络状态的方法中使用AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图} else { // 其他,下载小图}}
- 这时就会有iOS学习者开始抱怨:这不是很简单吗?于是三下五除二写完了以下代码。
1234567891011121314// 利用MVC,在设置cell的模型属性时候,下载图片- setItem:(CustomItem *)item{_item = item;UIImage *placeholder = [UIImage imageNamed:@"placeholderImage"];AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];} else { // 其他,下载小图[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder];}}
- 此时,确实能完成基本的按照当前网络状态下载对应的图片,但是真实开发中,这样其实是不合理的。以下是需要注意的细节:
- SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在
WiFi
环境下下载的高清图
,下次在蜂窝网络状态
下打开应用也应显示高清图
,而不是去下载缩略图。 - 许多应用设置模块带有一个功能:
移动网络环境下仍然显示高清图
。这个功能其实是将设置记录在沙盒中,关于数据保存到本地,可以查看本人另一篇简书首页文章
iOS本地数据存取,看这里就够了 - 当用户处于离线状态时候,无法合理处理业务。
- SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在
- 于是,开始加以改进。为了让读者你更容易理解,我先贴出伪代码:
123456789101112131415161718192021222324252627282930313233- setItem:(CustomItem *)item{_item = item;if (缓存中有原图){self.imageView.image = 原图;} else{if (Wifi环境){下载显示原图} else if (手机自带网络){if (3G\4G环境下仍然下载原图){下载显示原图} else{下载显示小图}} else{if (缓存中有小图){self.imageView.image = 小图;} else // 处理离线状态{self.imageView.image = 占位图片;}}}}
- 实现上面的伪代码:读者可以一一对应上面的伪代码。练习的时候推荐
先写伪代码
,再写真实代码 - 多多注意
注释
解释。
SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高。但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage。
使用场景:自定义的UITableViewCell上有图片需要显示,要求网络网络状态为WiFi时,显示图片高清图;网络状态为蜂窝移动网络时,显示图片缩略图。如下图样例:
图中显示的图片符合根据网络状态下载要求- 由于要监听网络状态,在这里笔者推荐使用AFNetWorking。
- 在GitHub或者利用cocoaPod给项目导入第三方框架AFNetWorking。
- 在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中监听网络状态。
12345678910111213141516// AppDelegate.m 文件中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{// 监控网络状态[[AFNetworkReachabilityManager sharedManager] startMonitoring];}// 以下代码在需要监听网络状态的方法中使用AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图} else { // 其他,下载小图}}
- 这时就会有iOS学习者开始抱怨:这不是很简单吗?于是三下五除二写完了以下代码。
1234567891011121314// 利用MVC,在设置cell的模型属性时候,下载图片- setItem:(CustomItem *)item{_item = item;UIImage *placeholder = [UIImage imageNamed:@"placeholderImage"];AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];} else { // 其他,下载小图[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder];}}
- 此时,确实能完成基本的按照当前网络状态下载对应的图片,但是真实开发中,这样其实是不合理的。以下是需要注意的细节:
- SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在
WiFi
环境下下载的高清图
,下次在蜂窝网络状态
下打开应用也应显示高清图
,而不是去下载缩略图。 - 许多应用设置模块带有一个功能:
移动网络环境下仍然显示高清图
。这个功能其实是将设置记录在沙盒中,关于数据保存到本地,可以查看本人另一篇简书首页文章
iOS本地数据存取,看这里就够了 - 当用户处于离线状态时候,无法合理处理业务。
- SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在
- 于是,开始加以改进。为了让读者你更容易理解,我先贴出伪代码:
123456789101112131415161718192021222324252627282930313233- setItem:(CustomItem *)item{_item = item;if (缓存中有原图){self.imageView.image = 原图;} else{if (Wifi环境){下载显示原图} else if (手机自带网络){if (3G\4G环境下仍然下载原图){下载显示原图} else{下载显示小图}} else{if (缓存中有小图){self.imageView.image = 小图;} else // 处理离线状态{self.imageView.image = 占位图片;}}}}
- 实现上面的伪代码:读者可以一一对应上面的伪代码。练习的时候推荐
先写伪代码
,再写真实代码 - 多多注意
注释
解释。
- 由于要监听网络状态,在这里笔者推荐使用AFNetWorking。