一款基于 AFN3.0 封裝鏈式風格的網絡請求庫
install
pod 'WBNetwork'
特性
- 網絡請求用的 AFNetworking
- block 回調方式
- 集約式的請求方法,鏈式調用
- 快速請求同一個 API 時,可以通過設置 minRequestInterval 防止這種情況發生。如果兩次請求時間間隔小于 minRequestInterval ,直接從緩存文件拿取數據。(如果對數據即時性要求較高,設置 minRequestInterval 為 0 關閉此功能)
- 可以同時發起多個請求,全部請求完成后有一個 block 回調,傳回來一個 Dictionary。字典 key 是請求的鏈接,value 是成功返回的數據 data 或者錯誤 error。
- 可以設置請求的默認參數。
- 兩個 baseURL,一個測試環境,一個正式環境。
- 簡單數據處理:可以選擇交付給業務層三種數據類型: NSDictionary(默認)、NSString、NSData
- 定義了一個插件機制。eg:加入 HUD 插件
使用示例
/**
* 1. 在合適的地方設置默認參數, 例如AppDelegate中didFinishLaunch方法
*/
//設置好baseUrl,發起請求的時候就可以寫部分URL。例如:url(@"/user/login")
WBREQUEST.baseUrlDebug = @"http://www.debug.com";//測試環境baseURL
WBREQUEST.baseUrlRelease = @"http://www.release.com";//正式環境baseURL
//默認請求參數,發起請求的時候可以不調用parameters方法,或者傳入除了默認參數之外的其他參數。
WBREQUEST.defaultParameters = @{@"appid":@"",@"appPass":@""};//訪問服務器的賬號和密碼。
//是否使用緩存,默認YES
WBREQUEST.cacheData = NO;
//發起同一請求最小時間間隔,默認1s
WBREQUEST.minRequestInterval = 2;
//添加HUD插件
[WBREQUEST wb_addPlugIn:[WBReqeustHUDPlugIn new]];
/**
* 2. 發起一個請求. 最簡單可以調用url success startRequest三個方法就可以發起一個請求.
*/
WBReqeustHUDPlugIn *plugIn = (WBReqeustHUDPlugIn *)[WBREQUEST plugInWithIdentifier:@"hud"];//hud插件
plugIn.HudInView = self.view;//可以選擇將hud加在self.view上而非window上
plugIn.HudText = @"正在登錄...";
//網絡請求
WBREQUEST.url(@"/user/login").parameters(@{@"phone":@"136********",@"passwd":@""}).success(^(NSURLSessionDataTask *task, id responsedObj){
WBLog(@"登錄成功");
}).failure(^(NSURLSessionDataTask *task, NSError *error){
WBLog(@"登錄失敗");
}).startRequest();
/**
* 3. 同時發起多個請求
*/
WBReqeustHUDPlugIn *plugIn = (WBReqeustHUDPlugIn *)[WBREQUEST plugInWithIdentifier:@"hud"];
plugIn.isPlugInFree = YES; // 讓插件失效
WBREQUEST.batchRequestTypes(@[WBPOST,WBPOST,WBPOST]).batchUrls(@[url0,url1,url2]).batchParameters(@[@{},@{},@{}]).batchRequestDone(^(NSDictionary *dic) {
//記得請求完成獎插件恢復能用
plugIn.isPlugInFree = NO;
WBLog(@"======================\ndic is %@\n================================",dic);
for (id obj in dic.allValues) {
if ([obj isKindOfClass:[NSError class]]) {
WBLog(@"obj 出現了\n有錯!");
} else {
WBLog(@"obj 出現了\n數據:%@",obj);
}
}
}).startBatchRequest();
編碼過程中的思考
- 網絡請求可以用 NSURLSession 或者 AFNetworking。方便起見,用了 AFNetworking
- 回調方式可以用 delegate 或者 block。為了使用方便就用了block。
//回調時,把一個block作為參數,所以這里沒法自動生成格式,得手寫。使用過程中可以拖到代碼塊以提高效率,就像 dispatch_once 也是寫成了代碼塊
success(^(NSURLSessionDataTask *task, id responsedObj){
WBLog(@"登錄成功");
}) - 請求方式可以用集約式或者離散式。同樣是方便起見,選擇了集約式的請求方式。YTKNetwork 是離散式請求方式,適用于大型項目。
- 方便起見,使用鏈式調用。可以設置baseUrl、默認參數等。最少可以用三個方法發起一個請求: url、success、startRequest。
- 為了防止快速連續的請求同一個接口。可以設置 minRequestInterval, 默認值是1s。就是說一秒內向一個接口發起兩次請求,第二次并不會真正發起請求,而是從緩存拿取數據。判斷時間間隔實用的是緩存文件的'最后修改時間'。
- 同時發起好幾個請求時候,因為WBRequest是個單例,所以可能出現回調錯亂的情況發生,為了解決這個問題,加了個recorder數組。每一個請求對應一個recorder,recorder持有success回調、failure回調,這樣回調就不會找錯了。
- 在A頁面發起一個請求,成功回調里面使用了 self,請求沒有完成時候用戶就點了返回鍵。這時候A并不會 delloc,而是等待接口請求成功/失敗后,走完回調方法才 delloc。這個功能實現是每次發起一個請求時候,就會創建一個 recorder 去持有 url、parameters、success 回調、failure 回調等。請求完成后會把這個 recorder 置 nil。
- 每發起一個請求前,檢查網絡狀況,沒網就直接提示用戶。
- 簡單的格式處理,可以直接返回給業務層三種數據類型:NSData、NSDictionary、NSString
- 緩存使用歸檔,每個請求的數據寫成一個文件。
Github地址
簡書地址
送上一個代碼塊 ^^
WBREQUEST.url(<#NSString * url#>).parameters(<#NSDictionary * parameters#>).success(^(NSURLSessionDataTask * task,id responseObject){
<#code#>
}).startRequest();