有时候我们有需求根据网络情况看是否显示一些大的图片。举个例子,很多应用都会有开屏广告,而开屏广告一般的还是好几百kb,如果是在2G、3G网络情况下,加载这样的网络图片会耗费很长时间,2G网络甚至会一直卡在页面没法进入应用,这对于应用来说是很不好的体验。
对于这样的情况,我们可以考虑在wifi情况下把开屏图片做一个缓存,把开屏图片的URL储存起来,下次打开应用,先判断网络情况,如果还是WiFi环境,直接重新加载,如果是非WiFi网络,根据请求回来的数据,把新的图片URL和储存的URL做一个比较,如果一样,说明还是上次的开屏图片,就可以直接把缓存的图片加载出来,如果URL不一致,说明不是同一个图片,就可以放弃图片。
图片的缓存有多种实现方案,因为是单张图片,轻量级的NSuseDefaults可以满足条件,把image转成nsdata,储存进去。也可以用plist文件。而如果加载图片用的是SDWebImage,也可以直接用sd封装好的方法储存图片,以下是实现过程。
1.判断网络情况(用ASIHTTP的Reachability类判断)
NSURL * URL = [NSURL URLWithString:Info.pic];
Reachability *reach = [Reachability reachabilityWithHostName: @"www.baidu.com"];
2.wifi网络,储存图片的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环境,匹配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;
}
}
续:其实SDWebImage在加载网络图片的时候已经默认做了缓存,有时候并不需要我们自己做缓存就可以直接满足需求,只需要匹配相关的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];