AFN和MBProgressHUD组合封装

摘要:
  现在分析graceTime和taskInProgress组合实现延迟加载HUD原理。很明显,若此时网络请求已经返回,则taskInProgress属性已经被设置为NO,再来到此方法时HUD不会显示,反之才会显示。

从事ios开发也有一段时间了,早就有开通博客的想法,但因总感觉没啥有技术含量的ideas,一再拖延。秉着丑媳妇也得见公婆的观念,趁着2015年的最后一天开通微博,于新年第一天正式开启偶的博客之路,欢迎各位拍砖指正,共同进步。

app开发时网络请求很常见,但是网络不可控。在网络数据未返回之前有必要给用户点提示,告诉用户app仍在工作中而不要让其傻等,我所认知的网络状态提示方法如下:

1、​所有控制器继承自一个基类,在基类中创建一个遮住整个视图的蒙版,蒙版上添加一个转圈控件,头文件暴露一个show和一个hidden方法供子类网络请求时调用。

2、直接使用三方框架MBProgressHUD或SVProgressHUD,每次网络请求时创建一个HUD添加到视图,网络请求完毕则销毁。

在公司项目开发中,这两种方法用着总是感觉有点淡淡地忧伤,网络很好时每当进入一个界面总会出现一闪而过的HUD,个人感觉很是老火,也影响用户体验,于是希望有一种方式能在网络状况优良时不弹出提示框,网络差时才让其出现。

早些日子详细看了下​MBProgressHUD源码发现其中就自带这个小功能,于是将其与AFN框架一起封装在一块,经过公司项目验证,工作正常,现在对其进行简单分析:

项目结构如下,是对AFN和MBProgressHUD的一个组合封装,实现能根据网络状况自由调节HUD的出现与否。
AFN和MBProgressHUD组合封装第1张

在网络工具类NetworkTool.h中定义了一个枚举,能选择网络提示框出现的合适时机,举个例子,若网络数据在0.7s之后返回,则依次选择如下枚举的实现效果是:0.5秒后出现HUD共计0.2s、不出现HUD、0.1s后出现HUD共计0.6s、不出现HUD、出现HUD共计0.7s​

网络提示框出现时机枚举

AFN和MBProgressHUD组合封装第2张

主要实现方法如下:

AFN和MBProgressHUD组合封装第3张
目标POST方法,GET方法实现基本一样

​  方法实现很大众,通俗易懂,这里需要稍微介绍下的是其中的两个子方法。

1、网络请求操作管理器manager的创建:

AFN和MBProgressHUD组合封装第4张

​AFN中默认的请求序列化器是HTTP类型,默认设置了请求头Content-Type为application/x-www-form-urlencoded。JSON类型时默认设置请求头Content-Type为application/json。

就我自己公司而言,当服务器要求设置请求头Content-Type为application/x-www-form-urlencoded,可知请求序列化器为HTTP类型,Content-Type为application/json时请求序列化器为JSON类型。

响应序列化器默认为JSON类型,一般公司都是这种,但当访问网页等时有时需要设置响应序列化器为HTTP类型,如示例程序。

2、转圈控件HUD的创建:

AFN和MBProgressHUD组合封装第5张

先是根据枚举设置graceTime时间,再是创建一个hud添加到窗口上,很简单。这里必须要设置属性taskInProgress为YES,并且在网络请求成功或失败后设置为NO,graceTime属性的设置才会生效,具体后面分析。

需要注意,​下面方法并不是马上将hud显示到窗口之上,具体后面分析。

AFN和MBProgressHUD组合封装第6张

下面把目光集中到hud的创建方法上,​

AFN和MBProgressHUD组合封装第7张

我公司一个中小型项目,目前的网络请求有近两百个,每次请求都创建一个HUD再销毁显然没这个必要,运用动态绑定技术将hud和该类绑定,在程序运行过程中当且创建一个hud,避免频繁创建销毁对象。

​  现在分析graceTime和taskInProgress组合实现延迟加载HUD原理。从方法[hud show:YES]入手。点进MBProgressHUD框架查看到该方法实现:

意思就是假若设置了graceTime,则开启定时器,在graceTime的时间之后再调用方法handleGraceTimer:方法,如下

AFN和MBProgressHUD组合封装第9张

此时若taskInProgress属性仍旧为YES才画出HUD显示到窗口上,否则不显示。很明显,若此时网络请求已经返回,则taskInProgress属性已经被设置为NO,再来到此方法时HUD不会显示,反之才会显示。

最后,工具​中还提供了一个判断是否有网的方法,+ (BOOL)hasNetworkReachability,可以将其添加到每个网络请求发起之前,若存在网络才发起请求,否则提示没有网络。

最近看到一个话觉得很有意思,貌似是位大神的座右铭,拿来主义直接用下:

Talk is cheap, Show me the code.

github代码地址:https://github.com/zhangmaliang/SimpleNetwork

免责声明:文章转载自《AFN和MBProgressHUD组合封装》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BZOJ3497 : Pa2009 Circular GamerabbitMq实战使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

odoo中接口开发

文章参考:https://blog.csdn.net/qq_33472765/article/details/81913627案例0000001接口调用请求说明:https请求方式:GET(请使用https协议)csrf=Falsecsrf(Cross-site request forgery跨站请求伪造)问题,get请求不影响,post就需要csrf认证...

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文《iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)》,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法...

IOS之同步请求、异步请求、GET请求、POST请求(转)

1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3、GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节; 4、POST请...

iOS网络NSURLSession使用详解

一、整体介绍 NSURLSession在2013年随着iOS7的发布一起面世,苹果对它的定位是作为NSURLConnection的替代者,然后逐步将NSURLConnection退出历史舞台。现在使用最广泛的第三方网络框架:AFNetworking、SDWebImage等等都使用了NSURLSession。作为iOS开发人员,应该紧随苹果的步伐,不断的学...

ios开发网络学习十二:NSURLSession实现文件上传

#import "ViewController.h" //----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @"----WebKitFormBoundaryjv0UfA04ED44AhWx" #define KNewLine [@" " dataUsingEncoding:NSUTF8St...

iOS -- MBProgressHUB

高级:http://www.jianshu.com/p/485b8d75ccd4 //只有小菊花 - (void)indeterminateExample { // Show the HUD on the root view (self.view is a scrollable table view and thus not suitable, // as...