基于AFNetworking3.0网络封装

来源:互联网 发布:php int加括号 编辑:程序博客网 时间:2024/05/17 23:19
1.AFURLConnectionOperation可以说是AFN最基础的类。继承自NSOperation类,将网络请求依附到一个operation上。从而让我们能够有效的控制并观察一个网络请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态。 
2.AFHTTPRequestOperation HTTP或HTTPS协议请求的AFURLConnectionOperation的子类。它封装的可接受状态码和内容的类型,判定一个请求结果是成功或失败 
3.AFHTTPRequestOperationManager 这个类是AFN类库的核心类。它封装完成了一种通用的模式,可以帮助我们轻松友好的完成请求的创建、响应的系列化,网络状态的监控以及安全策略以及每一个请求operation的管理(operation的相互依赖或状态改变) 
4.AFURLRequestSerialization 符合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header 
5.AFURLResponseSerialization 遵循AFURLResponseSerialization协议的对象,用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于mantle的模型对象 
6.AFNetworkReachabilityManager 网络的连通状态监控以及网络的类型。实际是将苹果官方提供的Reachability的类名和通知名更换了一下,防止和系统提供的类的通知名以及类名的冲突.




SDWebImage底层实现原理: 
其实是有沙盒缓存机制,主要由三块组成 
1.内存图片缓存2.内存操作缓存3.磁盘沙盒缓存 
1.UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先显示 placeholderImage ,同时由SDWebImageManager 根据 URL 来在本地查找图片 
2.SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是将UIImageView+WebCache同SDImageCache链接起来的类, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用来从缓存根据CacheKey查找图片是否已经在缓存中 
3.如果内存中已经有图片缓存, SDWebImageManager会回调SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo: 
4.如果内存中没有图片缓存,那么生成 NSInvocationOperation 添加到队列,从硬盘查找图片是否已被下载缓存。 
5.如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片 
6.如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo: 
7.图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败



基于AFNetworking3.0网络封装

2016年1月31日 标哥 暂无评论 2,550 阅读 

前言

对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口。很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了。

对于使用AFNetworking的朋友来说,很多朋友都是直接调用AFNetworkingAPI,这样不太好,无法做到全工程统一配置。

最好的方式就是对网络层再封装一层,全工程不允许直接使用AFNetworkingAPI,必须调用我们自己封装的一层,如此一来,任何网络配置都可以在这一层里配置好,使用的人无须知道里面在干嘛,只管调用就可以了。

本篇为基于AFNetworking3.0的版本,支持iOS7及其以上版本。若要支持iOS6,请阅读旧版本:http://www.henishuo.com/base-on-afnetworking-wrapper/

常用接口类型

应用开发过程中,所使用类型通常是GETPOST及上传图片。因此,这里只是对这几种类型提供API

GET接口


这里提供了两个GET请求的API,需要一般情况下GET请求都是直接写一个完整的URL,但是有时候为了参数可读性更强,改成传一个字典过来更容易阅读。

HYBResponseSuccess是响应成功的回调,返回的是字典,外部再转换成模型就可以了。
HYBResponseFail是响应失败的回调,只有一个NSError对象,外部可接收处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
/*!
*  @author 黄仪标, 15-11-15 13:11:50
*
*  GET请求接口,若不指定baseurl,可传完整的url
*
*  @param url     接口路径,如/path/getArticleList?categoryid=1
*  @param success 接口成功请求到数据的回调
*  @param fail    接口请求数据失败的回调
*
*  @return 返回的对象中有可取消请求的API
*/
+(HYBURLSessionTask*)getWithUrl:(NSString*)url
                          success:(HYBResponseSuccess)success
                             fail:(HYBResponseFail)fail;
/*!
*  @author 黄仪标, 15-11-15 13:11:50
*
*  GET请求接口,若不指定baseurl,可传完整的url
*
*  @param url     接口路径,如/path/getArticleList
*  @param params  接口中所需要的拼接参数,如@{"categoryid" : @(12)}
*  @param success 接口成功请求到数据的回调
*  @param fail    接口请求数据失败的回调
*
*  @return 返回的对象中有可取消请求的API
*/
+(HYBURLSessionTask*)getWithUrl:(NSString*)url
                           params:(NSDictionary*)params
                          success:(HYBResponseSuccess)success
                             fail:(HYBResponseFail)fail;
 
// 支持进度
+(HYBURLSessionTask*)getWithUrl:(NSString*)url
                           params:(NSDictionary*)params
                         progress:(HYBGetProgress)progress
                          success:(HYBResponseSuccess)success
                             fail:(HYBResponseFail)fail;
 

POST接口

对于POST请求类型的接口,只有一个,看注释就可以明白如何使用了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
/*!
*  @author 黄仪标, 15-11-15 13:11:50
*
*  POST请求接口,若不指定baseurl,可传完整的url
*
*  @param url     接口路径,如/path/getArticleList
*  @param params  接口中所需的参数,如@{"categoryid" : @(12)}
*  @param success 接口成功请求到数据的回调
*  @param fail    接口请求数据失败的回调
*
*  @return 返回的对象中有可取消请求的API
*/
+(HYBURLSessionTask*)postWithUrl:(NSString*)url
                            params:(NSDictionary*)params
                           success:(HYBResponseSuccess)success
                              fail:(HYBResponseFail)fail;
 
// 支持进度
+(HYBURLSessionTask*)postWithUrl:(NSString*)url
                            params:(NSDictionary*)params
                          progress:(HYBPostProgress)progress
                           success:(HYBResponseSuccess)success
                              fail:(HYBResponseFail)fail;```
 

图片上传接口

接口一次只能上传一张图片,通常也是这么处理的。这里是以文件流的形式来上传的哦。其中,mineTypeimage/jpeg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
/**
*  @author 黄仪标, 16-01-31 00:01:40
*
*  图片上传接口,若不指定baseurl,可传完整的url
*
*  @param image            图片对象
*  @param url              上传图片的接口路径,如/path/images/
*  @param filename     给图片起一个名字,默认为当前日期时间,格式为"yyyyMMddHHmmss",后缀为`jpg`
*  @param name             与指定的图片相关联的名称,这是由后端写接口的人指定的,如imagefiles
*  @param mimeType     默认为image/jpeg
*  @param parameters   参数
*  @param progress     上传进度
*  @param success      上传成功回调
*  @param fail             上传失败回调
*
*  @return
*/
+(HYBURLSessionTask*)uploadWithImage:(UIImage*)image
                                   url:(NSString*)url
                              filename:(NSString*)filename
                                  name:(NSString*)name
                              mimeType:(NSString*)mimeType
                            parameters:(NSDictionary*)parameters
                              progress:(HYBUploadProgress)progress
                               success:(HYBResponseSuccess)success
                                  fail:(HYBResponseFail)fail;
 

设置基础URL

这里还提供了两个公共接口,一个是用于设置或者更新网络接口的基础URL,一个是获取当前设置使用的网络接口基础URL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
/*!
*  @author 黄仪标, 15-11-15 13:11:45
*
*  用于指定网络请求接口的基础url,如:
*  http://henishuo.com或者http://101.200.209.244
*  通常在AppDelegate中启动时就设置一次就可以了。如果接口有来源
*  于多个服务器,可以调用更新
*
*  @param baseUrl 网络接口的基础url
*/
+(void)updateBaseUrl:(NSString*)baseUrl;
 
/*!
*  @author 黄仪标, 15-11-15 13:11:06
*
*  对外公开可获取当前所设置的网络接口基础url
*
*  @return 当前基础url
*/
+(NSString*)baseUrl;
 

添加公共请求头参数

通常每家公司的接口都会设置公共的请求头参数,以代表是公司的接口。默认已经配置了可接收的类型,但是如果需要额外配置,可通过调用此api来添加:

1
2
3
4
5
6
7
8
9
10
 
/*!
*  @author 黄仪标, 15-11-16 13:11:41
*
*  配置公共的请求头,只调用一次即可,通常放在应用启动的时候配置就可以了
*
*  @param httpHeaders 只需要将与服务器商定的固定参数设置即可
*/
+(void)configCommonHttpHeaders:(NSDictionary*)httpHeaders;
 

请求与响应格式设置

默认responseType和requestType都是JSON格式。如果不使用JSON,可以全局配置成自己希望的格式即可。若不配置,默认就是JSON。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
/*!
*  @author 黄仪标, 15-12-25 15:12:38
*
*  配置返回格式,默认为JSON。若为XML或者PLIST请在全局修改一下
*
*  @param responseType 响应格式
*/
+(void)configResponseType:(HYBResponseType)responseType;
 
/*!
*  @author 黄仪标, 15-12-25 15:12:45
*
*  配置请求格式,默认为JSON。如果要求传XML或者PLIST,请在全局配置一下
*
*  @param requestType 请求格式
*/
+(void)configRequestType:(HYBRequestType)requestType;
 

URL编码问题

考虑到网络请求接口中,有时候会有中文参数,这时候就会请求失败,因此我们要对这种类型的URL进行编码,否则请求会失败。这里是开启或者关闭自动将URL编码的接口,默认为NO,表示不开启。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
/*!
*  @author 黄仪标, 15-11-15 14:11:40
*
*  开启或关闭接口打印信息
*
*  @param isDebug 开发期,最好打开,默认是NO
*/
+(void)enableInterfaceDebug:(BOOL)isDebug;
 
/*!
*  @author 黄仪标, 15-11-15 15:11:16
*
*  开启或关闭是否自动将URL使用UTF8编码,用于处理链接中有中文时无法请求的问题
*
*  @param shouldAutoEncode YES or NO,默认为NO
*/
+(void)shouldAutoEncodeUrl:(BOOL)shouldAutoEncode;
 

网络接口数据日志

对于网络请求回来的结果,如果没有一个格式化好的日志打印出来查看,就要通过断点一步步跟踪,然后打开出来看,这太麻烦。因此,这里提供了打印日志的私有API。默认是不开启打印日志的。

1
2
3
4
5
6
7
8
9
10
 
/*!
*  @author 黄仪标, 15-11-15 14:11:40
*
*  开启或关闭接口打印信息
*
*  @param isDebug 开发期,最好打开,默认是NO
*/
+(void)enableInterfaceDebug:(BOOL)isDebug;
 

通常在AppDelegate中应用启动的代理方法中调用设置为开启就可以了。不过是否设置为开启,当应用以发布证书打包时,都不会打印日志,因为这里做了处理,可放心使用。

1
2
3
4
5
6
7
8
9
 
// 项目打包上线都不会打印日志,因此可放心。
#ifdef DEBUG
#define HYBAppLog(s, ... ) NSLog( @"[%@:in line: %d]-->[message: %@]", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define HYBAppLog(s, ... )
#endif
 
 

安装使用

现在已经支持cocoapods,引入以下命令即可:

1
2
3
 
pod'HYBNetworking','~> 2.0.0'
 

或者直接下载源代码,拖入工程使用!

源代码


请大家到我的github下载源代码:https://github.com/CoderJackyHuang/HYBNetworking
0 0