? ? ? 有時候我們有需求根據(jù)網(wǎng)絡情況看是否顯示一些大的圖片县好。舉個例子计螺,很多應用都會有開屏廣告,而開屏廣告一般的還是好幾百kb卜朗,如果是在2G蝌麸、3G網(wǎng)絡情況下点寥,加載這樣的網(wǎng)絡圖片會耗費很長時間,2G網(wǎng)絡甚至會一直卡在頁面沒法進入應用来吩,這對于應用來說是很不好的體驗敢辩。
? ? ? 對于這樣的情況,我們可以考慮在wifi情況下把開屏圖片做一個緩存误褪,把開屏圖片的URL儲存起來责鳍,下次打開應用,先判斷網(wǎng)絡情況兽间,如果還是WiFi環(huán)境历葛,直接重新加載,如果是非WiFi網(wǎng)絡嘀略,根據(jù)請求回來的數(shù)據(jù)恤溶,把新的圖片URL和儲存的URL做一個比較,如果一樣帜羊,說明還是上次的開屏圖片咒程,就可以直接把緩存的圖片加載出來,如果URL不一致讼育,說明不是同一個圖片帐姻,就可以放棄圖片。
? ? ? 圖片的緩存有多種實現(xiàn)方案奶段,因為是單張圖片饥瓷,輕量級的NSuseDefaults可以滿足條件,把image轉成nsdata痹籍,儲存進去呢铆。也可以用plist文件。而如果加載圖片用的是SDWebImage蹲缠,也可以直接用sd封裝好的方法儲存圖片棺克,以下是實現(xiàn)過程悠垛。
1.判斷網(wǎng)絡情況(用ASIHTTP的Reachability類判斷)
NSURL * URL = [NSURL URLWithString:Info.pic];
Reachability *reach = [Reachability reachabilityWithHostName: @"www.baidu.com"];
2.wifi網(wǎng)絡,儲存圖片的URL和圖片
if (reach.isReachableViaWiFi)
{
NSUserDefaults *set = [NSUserDefaults standardUserDefaults];
[set setURL:URL forKey:@"openImageUrl"];
[set synchronize];
[adImageView sd_setImageWithURL:URL completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL){
if (image)
{
skinBtn.hidden=FALSE;
}
}];
// 把開屏圖片緩存到磁盤
UIImage *image = _adImageView.image;
SDImageCache *imageCache = [SDImageCache sharedImageCache];
[imageCache storeImage:image forKey:@"openImageCache" toDisk:YES];
}
3.非wifi環(huán)境娜谊,匹配URL
else if (reach.isReachableViaWWAN)
{
NSURL *url = (NSURL *)[[NSUserDefaults standardUserDefaults]objectForKey:@"openImageUrl"];
NSString *pic = [NSString stringWithFormat:@"%@",url];
if ([pic isEqualToString:Info.pic])
{
SDImageCache *imageCache = [SDImageCache sharedImageCache];
UIImage *image = [imageCache imageFromDiskCacheForKey:@"openImageCache"];
adImageView.image = image;
}
}
續(xù):其實SDWebImage在加載網(wǎng)絡圖片的時候已經(jīng)默認做了緩存确买,有時候并不需要我們自己做緩存就可以直接滿足需求,只需要匹配相關的URL就可以查找是否緩存有圖片(會去磁盤和內存里面找):關鍵在于用SDWebImageManager這個類查找是否有緩存
上面的代碼可以簡化為:
if (cyAdInfo_)
{
UIButton* skinBtn = [UIButton buttonWithType:UIButtonTypeCustom];
skinBtn.hidden=TRUE;
UIImageView* adImageView=[[UIImageView alloc] init];
adImageView.userInteractionEnabled = TRUE;
adImageView.frame=self.view.bounds;
adImageView.contentMode = UIViewContentModeScaleAspectFill;
NSURL* URL = [NSURL URLWithString:cyAdInfo_.pic];
Reachability *reach = [Reachability reachabilityWithHostName: @"www.baidu.com"];
if (reach.isReachableViaWiFi)
{
[adImageView sd_setImageWithURL:URL completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
{
}];
adShowing = TRUE;
}
else if (reach.isReachableViaWWAN)
{
SDWebImageManager *manager = [SDWebImageManager sharedManager];
//分別判斷磁盤和內存中是否有跟相關URL匹配的image
if ([manager diskImageExistsForURL:URL]||[manager cachedImageExistsForURL:URL])
{
adImageView.image = [[manager imageCache] imageFromDiskCacheForKey:URL.absoluteString];
adShowing = TRUE;
skinBtn.hidden = FALSE;
}
}
self.adImageView = adImageView;
[self.view addSubview:adImageView];