對於AlamoFire幾點思考

来源:http://www.cnblogs.com/8hao/archive/2016/03/02/5234934.html
-Advertisement-
Play Games

本文由CocoaChina--BYB_1132(論壇ID)翻譯 原文:Thoughts On AlamoFire--Swift’s AFNetworking Implementation HTTP協議就是現代開發的同義詞,對於有經驗的iOS開發者來說, 熟悉並儘可能使用這些流行的協議是日常工作的基礎


本文由CocoaChina--BYB_1132(論壇ID)翻譯

原文:Thoughts On AlamoFire--Swift’s AFNetworking Implementation

HTTP協議就是現代開發的同義詞,對於有經驗的iOS開發者來說, 熟悉並儘可能使用這些流行的協議是日常工作的基礎。

不出意料,iOS 應用在這一點上沒有什麼不同,成千上萬的app和工程師都依靠廣受歡迎的AFNetworking 庫實現與伺服器的交互,JSON解析, 以及提供占位符圖片等多個功能。

簡言之,做到這些並不容易。這篇文章中我們了要解的是Alamofire庫。

基礎

Alamofire的核心主要是試圖簡化iOS中HTTP網路連接, 它通過使用NSURLSession以及Foundation URL Loading System來創建一個Swift本地的網路訪問介面,從而實現令人難以置信效率的任務。

Swift放棄了代理模式取而代之的使用了回調。對於我而言,我喜歡這個選擇。然而基礎承諾機制模式(promise-based patterns)也能起到一定作用, 它們也隱藏了一些壞代碼味道,對於一些人有點太神奇了。

進一步看,它是非同步實現的。你也許聽說過,但是在主線程上執行網路調用並不是一個好主意,不過Alamofire採用了許多創造性的最優方法。

例如,通過NSURLCache處理緩存來阻止不必要的訪問請求。另外,如果HTTP狀態碼在可接受的範圍內(200-300),就可以利用其豐富的鏈路模式通過少量代碼去做大量有意義的工作。

歷史總在重覆

Alamofire 也承續了AFNetworing使用者所熟悉的模式,一些處理方法也不同於它的前身,主要因為Alamofire是為了Swift而創建的。

例如, AFNetworking 調用子類AFHTTPSessionManager來使用每個API。也有例外,比如用NSURLSession替換NSURLConection。

Alamofire 通過遵守URLRequestConvertible協議創建一個路由Router來調用了類似的方法, 在底層,Alamofire 使用單例模式來創建在 NSURLSessionConfiguration.的頂層

初體驗 

我們開始吧

1 2 3 Alamofire.request(.GET, “http://www.telize.com/jsonip?callback=getip").response {(request, response, data, error) in     println(request + response + error) }

像AFNetworking 和其他的HTTP網路庫一樣,Alamofire提供了簡單、易用的方法來快速隨性的使用網路請求。這種特定的網路GET請求會返回一個請求對象,這個對象可以依附實現所有的HTTP過程的方法。

在Alamofire中,預設的行為規範是從伺服器響應積累到的NSData(數據),我通過一個閉包來鏈接一個響應處理程式來解析響應,或者但願對任何錯誤的響應不會發生在請求過程中。

  • 響應

響應通過HTTP用不同的形式顯現,最受青睞的毫無疑問是JSON, JSON是XML的衍生品,相對XML更年輕更健壯。Alamofire對JSON型數據很友好。

1 2 3 Alamofire.request(.GET, “http://httpbin.org/get").responseJSON {(request, response, JSON, error) in     println(JSON) }

有一系列簡單的JSON字元串作為指定的響應返回數據

我們繼續

在Alamofire中, 鏈接在其框架的使用中很底層, 每當想到在OC中用方括弧去定義類,讓人或高興或無奈。

Swift 像其他大多數高級語言一樣, 通過簡單的"."來調用函數, Alamofire 可以管理很多響應處理程式,而且一旦伺服器返迴響應它都會非同步執行。 

和往常一樣, 看示例最可靠

1 2 3 4 5 6 7 8 9 Alamofire.request(.GET, “http://httpbin.org/get")     .authenticate(HTTPBasic: user, password: password)     .progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in     println(totalBytesRead) }.responseJSON { (request, response, JSON, error) in     println(JSON) }.responseString { (request, response, string, error) in     println(string) }

參數

當然, 如果HTTP網路請求缺少了POST請求或查詢指定的訪問請求的能力就沒那麼令人期待了。

1 Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["key""value"])

在Alamofire需要內嵌一個包含參數的一個字典, 如果你不指向特定的參數, 將傳入nil。對於編碼來說也是一樣的, 在網路請求函數這是第四個參數.

枚舉

如果有人已經使用過swift, 它們可能發現枚舉在Swift 中是如此的好用。在 Objective-C中,即使有現代化的NS_ENUM,它仍然只是允許定義整數聲明。

Swift 還有很多小技巧

Alamofire充分擁有這些技巧, 因此在一個HTTP通信中所有的編碼參數邏輯都是用參數編碼(ParameterEncoding)枚舉實現, 所有的HTTP verbs都以 RFC 2616 §9 定義, 如下:

1 2 3 4 5 6 7 8 9 10 11 12 public enum Method: String {     case OPTIONS = “OPTIONS”     case GET = “GET”     case HEAD = “HEAD”     case POST = “POST”     case PUT = “PUT”     case PATCH = “PATCH”     case DELETE = “DELETE”     case TRACE = “TRACE”     case CONNECT = “CONNECT” }

同時,如果你好奇Swift枚舉強大的功能, 免費下載 swift starter guide。請原諒我做的這個小廣告。

路由

創建一個網路訪問路由是實現的關鍵, 在這裡將定義一些共同的用於同一個 API 的端點, 通過一個遵循URLRequestConvertible的枚舉來創建一個路由。

當一個枚舉遵循URLRequestConvertible時, 它需要包含一個叫做URLRequest的變數, 這個變數必須是NSURLRequest類型.

對於HTTP網路庫的通常做法發生在這裡, 使用者極大可能定義一個靜態字元串來代表一個基礎的URL以及API key/consumer secret.

記住,在現實世界中最好不要將這些內容放到源代碼周圍。我個人選擇plist文件。

在任何情況下……

工作流如下:

  • 定義一個基本的URL

  • 通過在枚舉中的case語句定義埠(例如 Users, Comments等等)

  • URLRequest初始化並通過一個跟蹤閉包設置。在閉包中, 增加參數並構造端點。

  • URL、URLRequest 和編碼都占一個完全的網路請求發送到伺服器 

多讀幾遍這個, 首先, 我認為這點有些不合理---一個函數實現過多的功能

在實踐中,它運作得很好:

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 enum APIRouter: URLRequestConvertible {     static let BASE_URL = //base url     static let API_KEY = //api key, consumer secret for OAuth, etc           case User(Int)     case ProfilePicture(Int, Size)     case Likes(Int, Int)        var URLRequest: NSURLRequest     {         let (path: String, parameters: [String: AnyObject]) =         {             switch self             {                  case .User (let page):                      let params = []//Provide params                      return (“/user”, params)                  case .ProfilePicture(let id, let size):                       var params = []                       return (“/profilepictures/\(id)”, params)                   case .Likes(let id, let commentsPage):                       var params = []                        return (“/likes/\(id)/user”, params)             }         }()            let URL = NSURL(string: APIRouter.BASE_URL)         let URLRequest = NSURLRequest(URL:URL!.URLByAppendingPathComponent(path))         let encoding = Alamofire.ParameterEncoding.URL         return encoding.encode(URLRequest, parameters: parameters).0     } }

一個強有力的例子, 但是我選擇把代碼展示的更形象些。

豐富的功能

Alamofire有許多讓程式猿信服去使用它的理由。在iOS開發中,使用NURLSession是HTTP網路的未來趨勢, 相比NSURLConnection來說,它的功能更加豐富: 

  • 後臺上傳和下載

  • 暫停以及重新開始網路操作的能力

  • 可配置的容器(Container)

  • 子類和私有存儲

  • 改進的認證處理

  • 對每個基礎連接進行身份驗證

  • 多種代理模式--NSURLConnection擁有非同步代碼塊的基本方法, 但是不能用它們的代理,NSURLSession具有一種混合型的方法。

我認為大家都同意這是正確的選擇, 如果有人對AFNetworking 能做而Alamofire不能做的感興趣的話,那麼有以下幾點:

  • UIKit 擴展

  • TLS驗證

  • NSOperation/NSURLConnection/AFURLConnectionOperation調用

  • 可達性(Reachability)

  • 多重HTTP網路請求構架

根據使用情況決定, 需要使用這些特點的要麼是破壞游戲規則的人,要麼是不在乎的人。

總結

在這一點上,部分工程師爭論認為NSURLSession讓AFNetworking變成了一個華麗的封裝。這可能在某種程度上是正確的,但即使如此--這是一件壞事嗎?

它在簡化和抽象方面做的很好,雖然它不包含AFNetworking可以做的所有功能,但是這是 Swift 中 HTTP 網路的一個良好開端。

問啊-一鍵呼叫程式員答題神器,牛人一對一服務,開發者編程必備官方網站:www.wenaaa.com

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!


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

-Advertisement-
Play Games
更多相關文章
  • 我以前寫過不少建議文章,學生時代寫過怎麼學習填鴨,畢業後寫過怎麼學習投資交易,最近寫過怎麼學習iOS開發。 寫的這些建議文章都有一個共同的毛病,建議多而全,使得看得人覺得難而累。 這次的建議,我儘量寫得簡化一點。 1、iOS開發學習iOS開發把我的工資提升了6倍多。而且,即使提升到16倍,我也不覺得
  • 前言:你用過Eclipse快捷鍵 Alt + Shift + J 麽?你看過源碼麽?如果看過,你註意過源碼上面的註釋麽?你知道為什麼看源碼註釋有些標識的參數可以直接點擊跳轉麽? 先出個題目,定義一個最簡單的Person類,三個屬性,一個name,一個age,一個性別,一個帶所有屬性參數的構造函數,你
  • 使用實例詳細闡述 日曆簽到功能 的實現方案,及 項目文件結構的設置方法
  • 前言 本篇文章精講iOS開發中使用Block時一定要註意記憶體管理問題,很容易造成迴圈引用。本篇文章的目標是幫助大家快速掌握使用block的技巧。 我相信大家都覺得使用block給開髮帶來了多大的便利,但是有很多開發者對block記憶體管理掌握得不夠好,導致經常出現迴圈引用的問題。對於新手來說,出現迴圈
  • 目錄 Android多解析度適配實踐【0】基礎適配篇(撰寫中)Android多解析度適配實踐【1】使用字體圖標,精準控制不同解析度的圖標樣式(內含兩枚神器)Android多解析度適配實踐【2】Iconify中文使用說明Android多解析度適配實踐【3】Iconify擴展,自製或導入SVG字體圖標庫
  • 序言 網路連接狀態檢測對於我們的iOS app開發來說是一個非常通用的需求。為了更好的用戶體驗,我們會在無網路時展現本地或者緩存的內容,並對用戶進行合適的提示。對絕大部分iOS開發者來說,從蘋果示例代碼改變而來的各種Reachablity框架是實現這個需求的普遍選擇,比如這個庫。但事實上,基於此方案
  • +(UIColor *)colorWithHexString:(NSString *)coloStr{ // 檢索 去下空格和換行 轉成大寫 NSString *cString = [[coloStr stringByTrimmingCharactersInSet:[NSCharacterSet w
  • 提高OC代碼質量的小心機 一、OC特性 OC 為 C 語言添加了面向對象特性,是其超集; OC 使用動態綁定的消息結構,也就是,在運行時才會檢查對象類型; 接收一條消息後,究竟應執行何種代碼,由運行期環境來決定,而非編譯器;ps:理解C語言的核心概念有助於寫好OC程式,尤其要掌握記憶體模型與指針。 二
一周排行
    -Advertisement-
    Play Games
  • 什麼是工廠模式 工廠模式是最常用的設計模式之一,屬於創建型模式。 有點: 解耦,可以把對象的創建和過程分開 減少代碼量,易於維護 什麼時候用? 當一個抽象類有多個實現的時候,需要多次實例化的時候,就要考慮使用工廠模式。 比如:登錄的抽象類ILoginBusiness,它有2個實現,一個用用戶名密碼登 ...
  • 這次iNeuOS升級主要升級圖形渲染引擎和增加豐富的圖元信息,可以很快的方案應用。總共增加41個通用和行業領域的圖元應用,增加2154個圖元信息,現在iNeuOS視圖建模功能模塊總共包括5894個行業圖元信息。現在完全支持製作高保真的工藝流程和大屏展示效果。 ...
  • 效果圖先附上: 首先 這是我是參考 教程:使用 SignalR 2 和 MVC 5 實時聊天 | Microsoft Docs 先附上教程: 在“添加新項 - SignalRChat”中,選擇 InstalledVisual> C#>WebSignalR>,然後選擇 SignalR Hub 類 (v ...
  • 一、前言 項目中之前涉及到胎兒心率圖曲線的繪製,最近項目中還需要添加心電曲線和血樣曲線的繪製功能。今天就來分享一下心電曲線的繪製方式; 二、正文 1、胎兒心率曲線的繪製是通過DrawingVisual來實現的,這裡的心電曲線我也是採用差不多相同的方式來實現的,只是兩者曲線的數據有所區別。心電圖的數據 ...
  • 安裝 Redis # 首先安裝依賴gcc, 後面需要使用make編譯redis yum install gcc -y # 進入 /usr/local/src 目錄, 把源碼下載到這裡 cd /usr/local/src # 下載 redis 7.0.2 的源碼,github被牆,可以使用國內的地址 ...
  • Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...
  • 事情的起因是收到了一位網友的請求,他的java課設需要設計實現迷宮相關的程式——如標題概括。 我這邊不方便透露相關信息,就只把任務要求寫出來。 演示視頻指路👉: 基於JavaFX圖形界面的迷宮程式演示_嗶哩嗶哩_bilibili 完整代碼鏈接🔎: 網盤:https://pan.baidu.com ...
  • Python中的字典 Python中的字典是另一種可變容器模型,且可存儲任意類型對象。鍵值使用冒號分割,你可以看成是一串json。 常用方法 獲取字典中的值 dict[key] 如果key不存在會報錯,建議使用dict.get(key),不存在返回None 修改和新建字典值 dict[key]=va ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“加班使我快樂”。 面試官: 看你簡歷上用過MySQL,問你幾個簡單的問題吧。什麼是聚簇索引和非聚簇索引? 這個問題難不住我啊。來之前我看一下一燈M ...
  • tunm二進位協議在python上的實現 tunm是一種對標JSON的二進位協議, 支持JSON的所有類型的動態組合 支持的數據類型 基本支持的類型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "s ...