美文网首页集思广益iOSer 的自我修养程序员
根据网络状态显示图片(封装SDWebImage,一行代码搞定复杂

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

作者: 鲲鹏DP | 来源:发表于2016-07-23 02:31 被阅读680次

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


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

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

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

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

    sd_setImageWithURL:placeholderImage:方法执行步骤

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

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

    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) {
    //加载完成回调
        }];
    
    

    相关文章

      网友评论

      • dzgdp888:根据网络状况来加载图片,这个封装的思路不错~
      • 简书弧线:学习了! :blush: 刚好想复习一下 SDWebImage 的封装
        鲲鹏DP: @简书弧线 相互学习😊

      本文标题:根据网络状态显示图片(封装SDWebImage,一行代码搞定复杂

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