根据网络状态显示图片(封装SDWebImage,一行代码搞定复杂业务逻辑)

SDWebImage是目前非常流行的可用于发送网络请求,加载图片的三方框架。功能强大,使用简单。这里我们讨论的不是SDWebImage加载图片的内部实现细节,而是在其基础上进一步封装,站在用户体验的角度上考虑如何加载图片才能达到最佳用户体验。


1.一款APP,加载显示图片怎样才能让用户有最佳的使用体验呢?

根据手机网络状态的不同,站在用户的角度上,应该做好以下几点:

  • ** 省钱:**能不用花自己钱的流量,就不用;不得不用时,节约,尽量少用;免费流量,大胆用。
  • 优质画面:在省钱,节约流量的前提下,尽量给用户最佳的视觉体验。

2.SDWebImage加载图片过程简单介绍

sd_setImageWithURL:placeholderImage:方法执行步骤

  • 1.取消当前ImageView关联的请求;
  • 2.设置占位图片到ImageView上去
  • 3.如果缓存中有图片就去缓存加载(缓存-->磁盘)
  • 4.没有就发送网络请求给服务器,加载图片
    注意:该方法不是直接就去发送网络请求给服务器,请求加载图片的,在这之前会先去内存和缓存中查看是否有现成的图片,有就不会发送网络请求。

3.根据网络状态我们该怎样去加载图片呢?

根据网络状态显示图片(封装SDWebImage,一行代码搞定复杂业务逻辑)_第1张图片
Snip20160723_2.png

4.上述过程的封装

/**
 * 根据网络状态,加载对应图片
 * @param oringinalImageUrl 原始图片
 * @param thumbnailImageURL 略缩图
 * @param palceHolderImage  占位图片
 * @param completedBlock    完成回调
 */

- (void)DKP_ImageWithOringinalImageURL:(NSString *)oringinalImageUrl thumbnailImageURL:(NSString *)thumbnailImageURL palceHolderImage:(UIImage *)placeholderImage completed:(SDWebImageCompletionBlock)completedBlock{
    //查看沙盒中是否有原图,有原图显示原图,没有原图考虑下载
    UIImage *bigImage =[[SDImageCache sharedImageCache]imageFromDiskCacheForKey:oringinalImageUrl];
    if (bigImage) {//有原图
        [self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
    }else {//没有原图
        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
        if (manager.reachableViaWiFi) {//wifi,直接加载原图
            [self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
        }else if (manager.reachableViaWWAN) {//蜂窝网
            BOOL alwaysLoadOriginalSource = YES;
# warning 这里是模拟的,真实情况需要去偏好设置查看用户是怎么设置的
            if (alwaysLoadOriginalSource) {//用户设置总是加载原图
                [self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
            }else {//加载略缩图
                [self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
            }
        }else {//没网有略缩图显示略缩图,没有显示占位图
            
            UIImage *smallImage =[[SDImageCache sharedImageCache]imageFromDiskCacheForKey:thumbnailImageURL];
            if (smallImage) {//有略缩图
                [self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
            }else {//没有略缩图
                [self sd_setImageWithURL:nil placeholderImage:placeholderImage completed:completedBlock];
            }
        }
        
    }
}

今后,一步就能搞定根据网络状态加载图片主的问题

   UIImageView *imageView = nil;//图片显示到ImageView上
   NSString *bigPictureURL = nil;//大图
    NSString *smallPictureURL = nil;//小图
   UIImage *placeholder = nil;//占位图
   [imageView DKP_ImageWithOringinalImageURL:bigPictureURL thumbnailImageURL: smallPictureURL palceHolderImage: placeholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//加载完成回调
    }];

你可能感兴趣的:(根据网络状态显示图片(封装SDWebImage,一行代码搞定复杂业务逻辑))