iOS網路層設計感想

来源:http://www.cnblogs.com/stevenfukua/archive/2017/02/07/6372818.html
-Advertisement-
Play Games

App的開發無外乎從網路端獲取數據顯示在屏幕上,數據做些緩存或者持久化,所以網路層極為重要。原來只是把AFNetwork二次封裝了一下,使得調用變得很簡單,並沒有深層次的考慮一些問題。 前言 參考: "網路層設計方案" 這篇文章提的問題也正是我平時經常糾結的,但是一直沒有深入思考。文章給的解決方案和 ...


App的開發無外乎從網路端獲取數據顯示在屏幕上,數據做些緩存或者持久化,所以網路層極為重要。原來只是把AFNetwork二次封裝了一下,使得調用變得很簡單,並沒有深層次的考慮一些問題。

前言

參考:
網路層設計方案
這篇文章提的問題也正是我平時經常糾結的,但是一直沒有深入思考。文章給的解決方案和為什麼這樣做讓人茅塞頓開。以下主要就是我的觀後感。

三個問題

  • 使用哪種交互模式來跟業務層做對接?
  • 是否有必要將API返回的數據封裝成對象然後再交付給業務層?
  • 使用集約化調用方式還是離散型調用方式去調用API?

我的設計

基本上每個網路層都會涉及到這三個問題。
我原先的設計是:

//APIClient.h
@interface APIClient : AFHTTPSessionManager

+ (instancetype)sharedRequestDataClient;

/*
 * 用json格式(POST)
 */
+ (void)requestDataPostMethodWithHTTPPath:(NSString *)path
                     parameters:(NSDictionary *)parameters
                        success:(RequestSuccessBlock)success
                        failure:(RequestFailureBlock)failure;
/*
 * 用json格式(GET)
 */
+ (void)requestDataGetMethodWithHTTPPath:(NSString *)path
                     parameters:(NSDictionary *)parameters
                        success:(RequestSuccessBlock)success
                        failure:(RequestFailureBlock)failure;

@end

//APIManager.h(一個個具體的請求,有多少個請求就有多少個方法)
@interface APIManager : NSObject

/**
 *  獲取用戶信息
 */
+ (void)requestUserInfoWithSuccess:(RequestSuccessBlock)success failure:(RequestFailureBlock)failure;

...
@end

@implementation APIManager

/**
 *  獲取用戶信息
 */
+ (void)requestUserInfoWithSuccess:(RequestSuccessBlock)success
                           failure:(RequestFailureBlock)failure { 
    [APIClient requestDataGetMethodWithHTTPPath:kUserInfo parameters:nil success:success failure:failure];
}

...
@end

APIClient繼承AFHTTPSessionManager,裡面做了些設置,比方說統一用json,就兩個方法,get,post請求。
本來還有上傳下載數據兩個方法,後來所有的資源文件放阿裡雲上,重建了個APIOSSClient類來處理。
APIManager具體處理一個個請求,有多少請求,他就有多少方法。由它來調用APIClient。

我的回答

  • 數據的傳遞方式:Block。
  • 交付什麼樣的數據:NSDictionary,在Block回調里把字典處理成最終需要的數據,大多數情況下是model,在model里會有數據處理。
  • APIClient是集約型,很不方便,加了個APIManager,實現離散型的調用,也就是加了個離散型調用的殼。

作者的建議

  • 數據的傳遞方式:Delegate。
  • 交付什麼樣的數據:不作處理,添加了reformer(名字而已,叫什麼都好),用於封裝數據轉化的邏輯。
  • 離散型的API調用方式。

感想

看了作者的思路和源碼,發現作者考慮的問題也都想到了,但是處理的方式有很大的問題。

傳遞方式和調用方式

最早我接手項目的時候,只有APIClient,簡單地做AFNetwork做了封裝,屬於集約型API調用方式,用block回調是正常的。
後來發現集約型API調用方式的弊端太多了,於是我加了個APIManager,規定所有的請求必須在裡面加個方法,算是加了個離散調用的殼。但是最後APIManager太大了,好多方法,維護起來好累。
所以調用的方式還是離散型的好,因為是離散型的,所有Delegate比Block好。

作者一個API對應於一個APIManager,更加容易維護。好處非常多。

傳遞數據

對於應該傳什麼數據,==其實我們的理想情況是希望API的數據下發之後就能夠直接被View所展示。首先要說的是,這種情況非常少。另外,這種做法使得View和API聯繫緊密,也是我們不希望發生的。==
這是作者的想法,我們也發現了這個問題,所以會單獨在寫個類處理,或者轉成model,在model里處理,最終變成view需要的數據。如果是model,為了不讓view和model耦合,又加了個category傳數據。

而作者加了個reformer統一處理,並且作者強調去model化,從根源解決了轉化成本高,model和view耦合等問題。

細節就不講了,作者開源的網路層很cool,除了使用起來非常方便,功能還非常全,全方面覆蓋。小伙伴們自己去學習吧。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當你在一個Xcode版本上編輯Storyboard並儲存後(比如 8.1)在另一個版本上(比如8.2.1)打開想繼續編輯的時候,有時候會無法打開Storyboard。 所以兩人合作編寫一個 Xcode project 的時候,一定要使用相同的版本。不然以後麻煩多多,會出現很多莫名其妙的問題。 有兩個 ...
  • AToolsActivity.java shake.xml AddressDao.java ...
  • 科技的仿生學無處不在,給予我們啟發。為了延長電池是使用壽命,google從蛇的冬眠中得到體會,那就是在某種情況下也讓手機進入類冬眠的情況,從而引入了今天的主題,Doze模式,Doze中文是打盹兒,打盹當然比活動節約能量了。 手機打盹兒的時候會怎樣呢? 按照google的官方說法,Walklocks, ...
  • 1:倉庫地址:https://github.com/jsonmodel/jsonmodel 主要作用是把JSON字元串轉成Model實體,也可以把實體轉化成JSON字元串;還包含一些轉字典的內容;JOSN字元串通過AFNetworking轉化成字典,然後再能過字典跟實體進行轉換; 2:原理實現: 主 ...
  • 效果: main_activity.xml ...
  • 如果我們的程式是在單線程下運行,或者是不必考慮到線程同步問題,我們應該優先使用StringBuilder類;如果要保證線程安全,自然是StringBuffer。 除了對多線程的支持不一樣外,這兩個類的使用方式和結果幾乎沒有任何差別, 區別在於StringBufferd支持併發操作,線性安全的,適 合 ...
  • 修改定價將你的app定價修改成0.99刀 修改你的發行範圍,全取消後只選中國。 save這時候你的app status將會變成pending contract。 將之前的修改都改回來,修改定價free,全選區域,然後save 這時候app status又會變成Ready for sale了,過個半小 ...
  • Controller控制器 import android.app.Dialog; import android.app.ProgressDialog; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...