美文网首页iOS 开发 IOS
用SDWebImage做图片缓存

用SDWebImage做图片缓存

作者: TyLee | 来源:发表于2016-02-28 00:35 被阅读555次

          有时候我们有需求根据网络情况看是否显示一些大的图片。举个例子,很多应用都会有开屏广告,而开屏广告一般的还是好几百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];

    相关文章

      网友评论

        本文标题:用SDWebImage做图片缓存

        本文链接:https://www.haomeiwen.com/subject/cjowkttx.html