在巨人的肩膀上(利用SDWebImage库再封装)

2024-06-18 21:48

本文主要是介绍在巨人的肩膀上(利用SDWebImage库再封装),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

其实SDWebImage已经封装的非常之好了,但是如果你的客户端有特殊需求的话就需要根据自己的需求做一个定制化的方案。今天我就是有个特殊需求,根据当前网络和用户设置需求去网络下载大图还是小图。

接下来开始正题,首先既然我们是根据当前网络去下载的图片,那么我们就需要检测当前网络的状态,这个可以自己写代码,当然也可以继续在“巨人的肩膀”上去寻找现成的类库。

我们的项目中一般都会导入网络请求的库AFNetWork,而这个库中就有一个AFNetworkReachabilityStatus来表示网络状态的库,我们就用这个去获取到当前网络的状态区分下载大图还是小图。

获取网络状态的代码如下:

AFNetworkReachabilityStatus status = [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus;

就是这么简单。
然后我们可以根据这个status去写使用哪种图片。详细逻辑如下:

if (status == AFNetworkReachabilityStatusReachableViaWiFi) {NSLog(@"当前是wifi,赶紧去下载大图片啊!");[currentImage sd_setImageWithURL:[NSURL URLWithString:bigImageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {NSLog(@"给当前图片下载并展示出来。");}];}else if (status == AFNetworkReachabilityStatusReachableViaWWAN){NSLog(@"这是3G/4G网,看情况下载大图还是小图");BOOL alwaysLoadBigImage = YES;//这个可以用 [[NSUserDefaults standardUserDefaults]boolForKey:@"用户选择的下载风格"];if (alwaysLoadBigImage) {NSLog(@"用户设置的总是下载大图");[currentImage sd_setImageWithURL:[NSURL URLWithString:bigImageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {NSLog(@"给当前图片下载并展示出来。");}];}else if (alwaysLoadBigImage) {NSLog(@"用户设置的下载小图");[currentImage sd_setImageWithURL:[NSURL URLWithString:smallImageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {NSLog(@"给当前图片下载并展示出来。");}];}else{NSLog(@"当前没网,只能显示holderimage了。");[currentImage setImage:[UIImage imageNamed:holderImage]];}}

以上就是根据网络状态和用户设置去判断下载大图还是小图。

当然你也可以自己在外面重新包装一层,就是看cache或者disk里面有没有需要的图片,但是这样的代码没什么用处,因为- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock已经有了这样的判断,这就是SDWebImage的内部实现机制。所以我自己也就不需要再去写一层封装了。

最后写一下自己的封装方法:

-(void)QFSDWebImageOriginImage:(NSString*)bigImageUrl thumbImage:(NSString*)smallImageUrl PlaceholderImage:(NSString*)holderImage withBlock:(SDWebImageCompletionBlock)completedBlock

以上方法就是我自定义的方法里面的实现代码。

这篇关于在巨人的肩膀上(利用SDWebImage库再封装)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073146

相关文章

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表