close
当前位置: 物联网在线 > 技术文库 > ios >

MBProgressHUD源码解析

听过好多次:“程序员要通过多读好的源码来提升自己”这样类似的话,而且又觉得自己有很多不会的,于是就马上启动了自己的 读好源码Project

从哪个框架开始呢?我想到了 SDWebImage ,但是大致看下来文件很多,代码也不少,不知道从何看起,于是作罢。所以茅塞顿开,还是从最最简单的框架开始吧~因为学习曲线要给自己设定得平缓一点才有利于稳步提升,小步快跑才是王道~

找着找着就找到了 MBProgressHUD ,这个框架只有两个文件,一个头文件和一个实现文件,很适合我现在的水平(对于一个没怎么读过源码的选手),于是就撸起了袖子开始了。

连查知识点带记笔记一共花了大概3个小时(虽然文件很少,但是里面好多东西都不知道[捂脸])。整体说来,收获还是比较大的,除了一些零碎的语法之外,框架作者对于代码结构的设计和各种情况的考虑还是很出色的,很值得学习,而且我在下文也有介绍。

这篇总结主要分三个部分来介绍这个框架:

核心Public API

方法调用流程图

方法内部实现

不多说了,开始吧~

1. 核心Public API 1.1 属性: @property (assign, nonatomic) MBProgressHUDMode mode;//HUD的类型 @property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR;//动画类型 @property (assign, nonatomic) NSTimeInterval graceTime;//show函数触发到显示HUD的时间段 @property (assign, nonatomic) NSTimeInterval minShowTime;//HUD显示的最短时间 1.2 类方法: /** * 在某个view上添加HUD并显示 * * 注意:显示之前,先去掉在当前view上显示的HUD。这个做法很严谨,我们将这个方案抽象出来:如果一个模型是这样的:我们需要将A加入到B中,但是需求上B里面只允许只有一个A。那么每次将A添加到B之前,都要先判断当前的b里面是否有A,如果有,则移除。 */ + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated; /** * 找到某个view上最上层的HUD并隐藏它。 * 如果返回值是YES的话,就表明HUD被找到而且被移除了。 */ + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated; /** * 在某个view上找到最上层的HUD并返回它。 * 返回值可以是空,所以返回值的关键字为:nullable */ + (nullable MBProgressHUD *)HUDForView:(UIView *)view; 1.3 对象方法: /** * 一个HUD的便利构造函数,用某个view来初始化HUD:这个view的bounds就是HUD的bounds */ - (instancetype)initWithView:(UIView *)view; /** * 显示HUD,有无动画。 */ - (void)showAnimated:(BOOL)animated; /** * 隐藏HUD,有无动画。 */ - (void)hideAnimated:(BOOL)animated; /** * 在delay的时间过后隐藏HUD,有无动画。 */ - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay;

看完了这些比较主要的API,我们看一下方法调用的流程图:

2. 方法调用流程图:

总体来说,这个第三方框架的接口还是比较整齐的,可以大致上分为两类:显示(show)和隐藏(hide)。而且无论是调用显示方法还是隐藏方法,最终都会走到私有方法 animateIn:withType: completion: 里(前提是附加动画效果)。可以看一下方法调用的流程图:

MBProgressHUD源码解析

方法调用流程图

看完方法调用的结构之后,我们来具体看一下方法内部是如何实现的:

3. 方法内部实现:

在讲解API之前,有必要先介绍一下HUD使用的三个Timer。

@property (nonatomic, weak) NSTimer *graceTimer; //执行一次:在show方法触发后到HUD真正显示之前,前提是设定了graceTime,默认为0 @property (nonatomic, weak) NSTimer *minShowTimer;//执行一次:在HUD显示后到HUD被隐藏之前 @property (nonatomic, weak) NSTimer *hideDelayTimer;//执行一次:在HUD被隐藏的方法触发后到真正隐藏之前

graceTimer:用来推迟HUD的显示。如果设定了graceTime,那么HUD会在 show 方法触发后的graceTime时间后显示。它的意义是:如果任务完成所消耗的时间非常短并且短于graceTime,则HUD就不会出现了,避免HUD一闪而过的差体验。

minShowTimer:如果设定了minShowTime,就会在 hide 方法触发后判断任务执行的时间是否短于minShowTime。因此即使任务在minShowTime之前完成了,HUD也不会立即消失,它会在走完minShowTime之后才消失,这应该也是避免HUD一闪而过的情况。

hideDelayTimer:用来推迟HUD的隐藏。如果设定了delayTime,那么在触发 hide 方法后HUD也不会立即隐藏,它会在走完delayTime之后才隐藏。

这三者的关系可以由下面这张图来体现(并没有包含所有的情况):

MBProgressHUD源码解析

三种timer


(责任编辑:ioter)

用户喜欢...

HiTSDB 时序数据库技术架构和产品解析

作者:场景研读 摘要: 8月24日阿里云数据库技术峰会上,来自阿里数据库事业部高级专家钟宇带来HiTSDB 时序数据库...


解析:阻碍物联网安全的五大因素

物联网安全事件呈爆发增长态势,安全威胁不断恶化。多国开始从战略、标准、监管等各层面提升对物联网安全的重...


【解析】全球物联网平台的发展现状

作为物联网产业生态中的关键组成部分,物联网平台处于万物互联时代软硬结合的枢纽位置:一方面肩负管理底层实...


全面解析工业机器人的控制系统

如果工业机器人只有主体和驱动器,机械臂是不能正常工作。原因是传感器输出的信号没有起作用,驱动电动机也得...


解析汽车“电子油门”究竟是怎么回事?

一般而言,增减油门就是指通过油门踏板改变发动机节气门开度,从而控制可燃混合气的流量,改变发动机的转速和...


解析无线监护远程医疗系统的设计原理

介绍了一种基于GPRS技术的无线远程医疗监护系统。以SPCE061A为主控芯片,将数据采集模块和GPRS通信模块相结合,以无...


解析烟雾器在银行安防系统升级改造的应用

银行是当今社会货币的主要流通场所,是国家经济运作的重要环节,业务涉及大量的现金、有价证券及贵重物品,因...


解析MCU技术发展线路 中国MCU如何取胜

微处理器和单片机(MCU)从上个世纪70年代在欧美开始兴起,1981年8051单片机问世,到今天已经36年了。从数量上看,8位单片机依然是MCU市场的主力,32位MCU已经成为今天全球消费和工业电子产...


解析数字印度 广和通携国际运营商 共话物联网商机

解析数字印度 广和通携国际运营商 共话物联网商机,8月8日,由广和通主办的助力中国智造走向全球第二站印度论坛高...


FPGA应用和设计要点详细解析

FPGA的应用 FPGA的用处比我们平时想象的用处更广泛,原因在于其中集成的模块种类更多,而不仅仅是原来的简单逻辑单元(LE)。早期的FPGA相对比较简单,所有的功能单元仅仅由管脚、内部...