iOS封裝AFNetworking3.0網絡請求,進行本地數據緩存,json格式驗證

在ios開發中,網絡請求是比不缺少的一部分,做開發的絕大多數都是用的是AFNetworking框架,因為它簡單好上手,很多網絡方法是直接調用的,但是面對各種業務需求如何將網絡請求更好的封裝起來是我們值得好好考慮的。不得不說猿題庫網絡請求確實把AFN封裝的挺好的,基本上項目上的需求它都能實現并且還有好多高級功能,我就不在這介紹猿題庫的網絡請求怎么樣厲害了,猿題庫網絡請求demo 有興趣的同學可以研究下。

今天就想跟大家分享一下我做網絡請求緩存到本地的思路。做網絡緩存呢為的就是優化用戶體驗,減少用戶對接口的請求節省流量。下面說一下我的思路:

  • 數據請求下來怎么存

  • 如何設置緩存的時間

  • 數據存儲的類型,比如寫緩存不讀緩存等

  • 讀取緩存數據,如何區分

  • 數據錯誤處理

  • 上拉刷新強制更新數據,下拉加載是讀緩存還是重新請求

  • 對于一些接口需要重復請求處理 比如:視頻列表多次點擊上傳用戶記錄等

可能你的網絡請求是這樣的:

+ (void)request:(NSString *)urlString withParamters:(NSDictionary *)dic success:(void (^)(id responseData))success failure:(void (^)(NSError *error))failure;

發起一個網絡請求,使用的時候urlStr基本上就是固定的用宏來定義的。dic就是傳遞的字典.success 和failure 分別表示請求成功和失敗的回調

像比如上傳播放記錄等什么的,上面那個方法里面有提示視圖(MBProgressHUD),上傳記錄肯定不能調用那個方法,因為有提示圖啊,用戶一切換視頻什么的提示記錄上傳成功,那肯定不行吧,那就在寫一個沒有提示的方法比如這個:

+ (void)requestNoProgress:(NSString *)urlString withParamters:(NSDictionary *)dic success:(void (^)(id responseData))success failure:(void (^)(NSError *error))failure;

或許項目中有的地方需要POST請求,有的需要GET請求或者HTTPS請求,光寫方法就需要4-5個,這樣問題就很突出而且很麻煩。其實,我自己在項目中就是這樣寫的。哈哈

我重新將網絡請求整理了一下,加入了緩存和json字段檢驗,后期肯定還要加很多東西,更改的同時會一并更新到GitHub上。demo下載地址

簡單說一下代碼結構,主要就三個MNetSetting網絡請求設置類MNetworkUtils網絡請求工具類MNetRequestModel網絡請求,負責請求數據。其實分成三個文件去寫為了就是減少代碼的冗余度增加可讀性(其實代碼很渣)。

先來看一下,demo中網絡請求是怎么用的:

    MNetSetting *set = [[MNetSetting alloc]init];
    set.isHidenHUD = YES;//隱藏提示圖
    set.cashSeting = MCacheSave;//進行緩存,默認緩存時間3分鐘
    set.cashTime = 5;//緩存時間5分鐘
    //進行json格式驗證,可以寫可不寫
    set.jsonValidator = @{@"entity":[NSDictionary class],
                          @"entity":@{@"indexCenterBanner":[NSArray class]}
                          };
    [set requestDataFromHostURL:@"請求地址,必傳" andParameter:@"參數,可不傳" success:^(id responseData) {
    //數據請求成功回調
    } failure:^(NSError *error) {
     //失敗回調   
    } //傳入網絡請求緩存策略設置
    netSeting:set];

再來說一下MNetSetting這個類:

這個里面主要就是對網絡請求的整體配置了。分別有兩個枚舉MCashTime設置緩存策略 MRequesttMethod網絡請求方式,POST和GET;枚舉也沒寫幾個,因為暫時想到的也只有這么多,大部分寫的是屬性。簡單說下屬性:

/** *是否顯示HUD,默認顯示*/
@property (nonatomic, assign) BOOL isHidenHUD;
/** *是否是HTTPS請求,默認是NO*/
@property (nonatomic, assign) BOOL isHttpsRequest;
/** *緩存設置策略*/
@property (nonatomic, assign) MCashTime cashSeting;
/** *是否刷新數據*/
@property (nonatomic, assign) BOOL isRefresh;
/** *是否讀取緩存*/
@property (nonatomic, assign) BOOL isReadCash;
/** *緩存時間*/
@property (nonatomic, assign) NSInteger cashTime;
/** *請求方式,默認POST請求*/
@property (nonatomic, assign) MRequesttMethod requestStytle;
/** *地址*/
@property (nonatomic, strong) NSString *hostUrl;
/** *參數*/
@property (nonatomic, strong) NSDictionary *paramet;
/** *驗證json格式*/
@property (nonatomic, strong) id jsonValidator;

只有一個網絡請求方法:

/**
 通過url獲取數據或獲取緩存數據

 @param url 請求地址
 @param parameter 參數
 @param success 成功回調
 @param failure 失敗回調
 @param seting 網絡請求設置
 */
-(void)requestDataFromHostURL:(NSString *)url
             andParameter:(NSDictionary *)parameter
                  success:(void (^)(id responseData))success
                  failure:(void (^)(NSError *error))failure
                  netSeting:(MNetSetting *)seting;

當整理這些東西的時候都在想,這些數據我以什么樣的方式去緩存到本地呢。第一個就將plist文件排除在外,因為plist文件是覆蓋性的存一次還要將以前存的文件都拿出來再放回去,麻煩。在網上簡單查了一下有人用fmdb和sqlite 感覺存個數據就要動用數據庫是不是鬧的動靜有點大,想來想起還是用歸檔和解檔將數據以文件形式存入本地。所以上面寫的:數據請求下來怎么存的問題解決了

現在考慮如何設置緩存時間,可能MNetSetting這個里面的屬性也看了,可以調用屬性設置緩存時間,3分鐘,5分鐘,1天等,自主設置;

數據存儲的類型;上拉刷新強制更新數據,下拉加載是讀緩存還是重新請求;加載數據寫緩存,上拉加載更多不讀緩存 這些都是通過屬性去設置的

數據錯誤處理 項目中經常有一些數據的類型判斷,比如:返回數據的entity是字典還是數組,在項目中或許你經常是這樣寫的

if ([responseData[@"entity"] isKindOfClass:[NSArray class]]){
     ....
  }

如果不這樣寫,過分依賴接口返回的數據可能會因數據類型不對導致程序崩潰.如果這樣寫而需要在每個接口返回的數據中都要加if判斷,很麻煩而且可讀性也不高。我在demo中加入了,json返回數據的類型判斷,這樣就避免了每次去寫判斷,在進行緩存時也不會緩存錯誤數據。這里的json類型判斷是參考猿題庫寫的,json類型判斷你可以這樣用:

MNetSetting *set = [[MNetSetting alloc]init];
set.isHidenHUD = YES;
// indexCenterBanner 是entity的下級
set.jsonValidator = @{
                    @"entity":[NSDictionary class],
                    @"entity":@{@"indexCenterBanner":[NSArray class]}
                     };

緩存的讀取是根據本地緩存數據創建的時間與請求時間相比對來決定是取本地緩存還是重新請求接口。文件創建時間是根據文件管理器NSFileManager來獲取的,獲取文件創建時間,是一個NSDate類型:

NSString *path = [self cacheFilePath];
NSError * error;
NSFileManager *fileManager = [NSFileManager defaultManager];
//通過文件管理器來獲得屬性
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:path error:&error];
NSDate *fileCreateDate = [fileAttributes objectForKey:NSFileCreationDate];

比較兩個文件時間來決定是否讀取緩存:

NSComparisonResult result = [currentDate compare:fileDate]; 
//NSOrderedDescending 降序排列 說明文件創建時間超過當前時間,刷新數據
//NSOrderedAscending 升序 說明 文件創建時間小于當前時間,返回緩存數據

東西不是很多,主要就是說一下思路以及對接口請求下來的數據做json驗證處理。demo中也都有注釋,有一些具體細節可以看一下demo。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,800評論 18 139
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,155評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,677評論 25 708
  • 時間:2017年7月18日 星期二 地點:卡樂咪牧笛兒童之家室內 活動內容:工作時間 美好的一天結束了,明天見!
    夢與自由閱讀 219評論 0 0
  • 昨夜做夢時候,夢見該是禮佛的日子,急匆匆的買水果時。在水果攤旁見到一棵很高很高的樹,樹上掛滿紅絲帶。旁邊水果攤的...
    苜蓿partlia閱讀 346評論 0 1