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)

用户喜欢...

IBM解析2018年最流行的五项IoT趋势

2017年,物联网技术(loT)为传统行业带来了变革的风声和兴奋的议论。这是一场实质性的转变。我们已经能够看到,几乎所有的行业都在投资物联网,而且其中的佼佼者已经开始迅速采取行...


自动扫地机器人好用吗?智能特性全面解析

生活在如今这样一个节奏快、工作压力大的时代,我们的压力也是越发的大了,但是人类的智慧是强大的,智能家居...


深度解析FPGA四大设计要点

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


从图像到知识:深度神经网络实现图像理解的原理解析

摘要:本文将详细解析深度神经网络识别图形图像的基本原理。针对卷积神经网络,本文将详细探讨网络中每一层在图像识别中的原理和作用,例如卷积层(convolutional layer),采样层(pooling la...


单片机最小系统解析(电源、晶振和复位电路)

我们在学习过程中,很多指标都是直接用的概念指标,比如我们说 +5 V 代表1,GND 代表0等等。但在实际电路中的电压值并不是完全精准的,那这些指标允许范围是什么呢?随着我们所学的内容...


技术解析:微流控芯片为什么这样强大?

从1990年Manz等人首次提出了微型全分析系统的概念,到2003年Forbes杂志将微流控技术评为影响人类未来15件最重要的发明之一,微流控技术得到了飞速的发展,其中的微流控芯片技术作为当前分...


解析单片机与CPU的区别

多人都认为,单机片和CPU不是属于两种不同的东西吗?他们怎么可以拿来比较,其实有专业人士就知道单机片和CPU 的关系可以说是十分的密切。本文来分享一下,他们到底隐藏着什么秘密。...


陆金所计葵生:深度解析大数据和AI对未来金融影响

陆金所联席董事长兼CEO计葵生在北京大学数字金融研究中心「数字金融的中国时代」第二届年会上发表主题演讲,深...


滴滴插件化方案 VirtualApk 源码解析

之前一直没有写过插件化相关的博客,刚好最近滴滴和360分别开源了自家的插件化方案,赶紧学习下,写两篇博客,第一篇是滴滴的方案: https://github.com/didi/VirtualAPK 那么其中的难点很明显是...


STM32 FSMC驱动TFTLCD 难点解析

本篇文章三个主题:FSMC有关配置、一串字符显示原理、汉字显示原理。 一、FSMC的有关配置(博主用的是FSMC_A10): 来自别人家的博客 FSMC的介绍就不介绍了,网上一大片。我们就讨论讨论为...