集思广益iOSer 的自我修养程序员

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

2016-07-23  本文已影响680人  鲲鹏DP

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


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

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

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

sd_setImageWithURL:placeholderImage:方法执行步骤

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

上一篇 下一篇

猜你喜欢

热点阅读