SDWebImage的一些使用技巧
2016-05-05 本文已影响0人
ArsonQ
转载于:http://www.jianshu.com/p/dabc0c6d083e 作者:hosea_zhou(简书作者)
SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高。很多时候在网络网络状态为WiFi时,显示图片高清图;网络状态为蜂窝移动网络时,显示图片缩略图。
由于要监听网络状态,可以使用RealReachability与AFNetWorking,这两个都是在Github获得大量star的第三方开源框架,在这里主要讲AFNetWorking。
我们利用cocoaPods导入第三方框架AFNetWorking到项目中。
在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中监听网络状态。
// AppDelegate.m 文件中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 监控网络状态
[[AFNetworkReachabilityManager sharedManager] startMonitoring];}
// 以下代码在需要监听网络状态的方法中使用
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
if (mgr.isReachableViaWiFi) {
// 在使用Wifi, 下载原图
} else {
// 其他,下载小图
}
}
但因机制原因,实际中下载图片的操作是这样的
- setItem:(CustomItem *)item{
_item = item;
// 占位图片
UIImage *placeholder = [UIImage imageNamed:@"placeholderImage"];
// 从内存\沙盒缓存中获得原图
UIImage *originalImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:item.originalImage];
if (originalImage) { // 如果内存\沙盒缓存有原图,那么就直接显示原图(不管现在是什么网络状态) self.imageView.image = originalImage;
}
else {
// 内存\沙盒缓存没有原图
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下载原图
[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];
}
else if (mgr.isReachableViaWWAN) { // 在使用手机自带网络 // 用户的配置项假设利用NSUserDefaults存储到了沙盒中
// [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"alwaysDownloadOriginalImage"];
// [[NSUserDefaults standardUserDefaults] synchronize];
#warning 从沙盒中读取用户的配置项:在3G\4G环境是否仍然下载原图
BOOL alwaysDownloadOriginalImage = [[NSUserDefaults standardUserDefaults] boolForKey:@"alwaysDownloadOriginalImage"];
if (alwaysDownloadOriginalImage) {
// 下载原图
[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];
}
else {
// 下载小图
[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder]; }
} else {
// 没有网络
UIImage *thumbnailImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:item.thumbnailImage];
if (thumbnailImage) {
// 内存\沙盒缓存中有小图
self.imageView.image = thumbnailImage;
}
else {
// 处理离线状态,而且有没有缓存时的情况
self.imageView.image = placeholder;
}
}
}
}