YTKNetwork 源碼閱讀(一)-整體框架

圖片發自簡書App

有 AFNetworking 了,為什么還要用 YTKNetwork ? (以下1、2條文字摘自 YTKNetwork 的 readme)

  1. YTKNetwork 是基于 AFNetworking 封裝的,提供了一些更高級的功能。
  • 支持按時間緩存網絡請求內容
  • 支持按版本號緩存網絡請求內容
  • 支持統一設置服務器和 CDN 的地址
  • 支持檢查返回 JSON 內容的合法性
  • 支持文件的斷點續傳
  • 支持 block 和 delegate 兩種模式的回調方式
  • 支持批量的網絡請求發送,并統一設置它們的回調(實現在 YTKBatchRequest 類中)
  • 支持方便地設置有相互依賴的網絡請求的發送,例如:發送請求 A,根據請求 A 的結果,選擇性的發送請求 B 和 C,再根據 B 和 C 的結果,選擇性的發送請求 D。(實現在 YTKChainRequest 類中)
  • 支持網絡請求 URL 的 filter,可以統一為網絡請求加上一些參數,或者修改一些路徑。
  • 定義了一套插件機制,可以很方便地為 YTKNetwork 增加功能。猿題庫官方現在提供了一個插件,可以在某些網絡請求發起時,在界面上顯示“正在加載”的 HUD。
  1. YTKNetwork 的封裝運用了 command 設計模式,有如下幾個好處:
  • 將網絡請求與具體的第三方庫依賴隔離,方便以后更換底層的網絡庫。實際上 YTKNetwork 最初是基于 ASIHttpRequest 的,我們只花了兩天,就很輕松地切換到了 AFNetworking。
  • 方便在基類中處理公共邏輯,例如猿題庫的數據版本號信息就統一在基類中處理。
  • 方便在基類中處理緩存邏輯,以及其它一些公共邏輯。
  • 方便做對象的持久化。
  1. YTKNetwork 把每個請求都封裝成對象,代碼組織的時候可以把所有的請求類都放到一個目錄底下,我個人是比較喜歡這種組織方式。

說下 YTKNetwork 里面重要的幾個類

  1. YTKNetworkConfig 存儲一些全局的網絡配置。比較重要的就是 baseUrl(根URL路徑)、cdnUrl(CDN服務器路徑)、urlFilters(在請求發送之前,附加到URL路徑上的一些公共參數)。

  2. YTKRequest 相當于 command 設計模式中的 command。使用過程中,我們通過創建基于 YTKRequest 的網絡請求類,重寫一些父類的方法來訪問后臺。他是繼承于 YTKBaseRequest。YTKBaseRequest 類提供了開始網絡請求的便利方法。

     //YTKBaseRequest 類
    
     //  把一個請求加到隊列里面,并且開始這個請求
     - (void)start; // -> 調用 YTKNetworkAgent 的 addRequest: 方法
    
     /// 把一個請求從請求隊列里面移除掉,并且取消這個請求。   
     - (void)stop;  // -> 調用 YTKNetworkAgent 的 cancelRequest: 方法
    
     ///  便利請求方法,包含成功和失敗的block回調.
     - (void)startWithCompletionBlockWithSuccess:(nullable YTKRequestCompletionBlock)success
                                 failure:(nullable YTKRequestCompletionBlock)failure;  // -> 調用 [self start] 并且設置成功和失敗的兩個回掉
    
  3. YTKNetworkAgent 類是一個單例,相當于 command 設計模式中的接收器,發出指令的對象和被調用的對象就是通過它來實現解耦的。網絡請求的操作是在這里開始的。

     //YTKNetworkAgent 類
    
     ///  添加一個網絡請求并開始
     - (void)addRequest:(YTKBaseRequest *)request;
     ///  取消之前添加的一個網絡請求
     - (void)cancelRequest:(YTKBaseRequest *)request;
     ///  取消之前添加的所有網絡請求
     - (void)cancelAllRequests;
    
  4. YTKNetworkPrivate 類包含了一個工具類和一些 extension

     //YTKNetworkUtils 
     // 驗證json的有效性
     + (BOOL)validateJSON:(id)json withValidator:(id)jsonValidator;
     // 阻止 iTunes 在應用中保存數據
     + (void)addDoNotBackupAttribute:(NSString *)path;
     // 對字符串進行 md5 加密
     + (NSString *)md5StringFromString:(NSString *)string;
     // 獲取 app 的版本號
     + (NSString *)appVersionString;
    
  5. YTKBatchRequest 用于方便的發送批量的請求。它是一個容器類,可以放置多個繼承于 YTKRequest 的請求實例。

     // 通過一個請求數組創建一個 batch 請求
     - (instancetype)initWithRequestArray:(NSArray<YTKRequest *> *)requestArray;
     // 開始這個 batch 請求
      - (void)startWithCompletionBlockWithSuccess:(nullable void (^)(YTKBatchRequest *batchRequest))success
                                 failure:(nullable void (^)(YTKBatchRequest *batchRequest))failure;
    
  6. YTKChainRequest 用于管理相互之間有依賴的多個請求。

     // YTKChainRequest
     //添加一個請求并開始
     - (void)addRequest:(YTKBaseRequest *)request callback:(nullable YTKChainCallback)callback;
    
     // 官方示例: 
     - (void)sendChainRequest {
         // 創建一個注冊的請求
         RegisterApi *reg = [[RegisterApi alloc] initWithUsername:@"username" password:@"password"]; 
         // 創建 chain 請求實例
         YTKChainRequest *chainReq = [[YTKChainRequest alloc] init];
         // 開始注冊請求
         [chainReq addRequest:reg callback:^(YTKChainRequest *chainRequest, YTKBaseRequest *baseRequest) {
             RegisterApi *result = (RegisterApi *)baseRequest;
             NSString *userId = [result userId];
             //注冊請求完成,開始獲取個人信息的請求
             GetUserInfoApi *api = [[GetUserInfoApi alloc] initWithUserId:userId];
             [chainRequest addRequest:api callback:nil]; //這里仍然調用了 addRequest:callback: 方法,回調為nil
    
         }];
         chainReq.delegate = self;
         // start to send request
         [chainReq start];
     }
    
     // YTKChainRequestDelegate  代理
    
     // 所有 chain 請求完成的回調
     - (void)chainRequestFinished:(YTKChainRequest *)chainRequest;
    
     // 某個 chain 請求失敗的回調
     - (void)chainRequestFailed:(YTKChainRequest *)chainRequest failedBaseRequest:(YTKBaseRequest*)request;
    

YTKNetwork 源碼閱讀(二)-一次POST請求的完整歷程

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念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

推薦閱讀更多精彩內容

  • 第一篇第二篇大概是把下載圖片緩存圖片的這個邏輯走完了,里面涉及好多類。 羅列一下 UIView+WebCache ...
    充滿活力的早晨閱讀 761評論 0 1
  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,371評論 0 12
  • 技術無極限,從菜鳥開始,從源碼開始。 由于公司目前項目還是用OC寫的項目,沒有升級swift 所以暫時SDWebI...
    充滿活力的早晨閱讀 12,675評論 0 2
  • 有句話叫做:還沒好好享受青春,就變老了。而我想說的是,一切都剛要開始,卻要結束了。今天是12月27日了,再過4天,...
    Hi楚夢蝶閱讀 185評論 0 0
  • 小時候聽大人說鬼故事,每次聽完都感覺毛骨悚然。村西頭的老胡頭,一肚子故事,每到天擦黑,大伙兒都吃過晚飯之后,就開始...
    霧歌閱讀 349評論 0 0