基於AFNetworking3.0網絡封裝

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網絡封裝

前言

對於開發人員來說,學習網絡層知識是必備的,任何一款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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章