轉載于:http://www.itdecent.cn/p/dabc0c6d083e 作者:hosea_zhou(簡書作者)
SDWebImage作為目前最受歡迎的圖片下載第三方框架,使用率很高。很多時候在網絡網絡狀態(tài)為WiFi時,顯示圖片高清圖;網絡狀態(tài)為蜂窩移動網絡時,顯示圖片縮略圖。
由于要監(jiān)聽網絡狀態(tài),可以使用RealReachability與AFNetWorking,這兩個都是在Github獲得大量star的第三方開源框架,在這里主要講AFNetWorking。
我們利用cocoaPods導入第三方框架AFNetWorking到項目中。
在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中監(jiān)聽網絡狀態(tài)。
// AppDelegate.m 文件中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 監(jiān)控網絡狀態(tài)
[[AFNetworkReachabilityManager sharedManager] startMonitoring];}
// 以下代碼在需要監(jiān)聽網絡狀態(tài)的方法中使用
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) { // 如果內存\沙盒緩存有原圖,那么就直接顯示原圖(不管現在是什么網絡狀態(tài)) 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環(huán)境是否仍然下載原圖
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 {
// 處理離線狀態(tài),而且有沒有緩存時的情況
self.imageView.image = placeholder;
}
}
}
}