Alamofire源碼學習(八): URLConvertible與URLRequestConvertible

往期導航:

Alamofire源碼學習目錄合集git

簡介

  • URLConvertible協議定義了能夠將任意對象轉換爲URL對象,在建立URLRequest時使用
  • URLRequestConvertible協議定義了能夠將任意對象轉換爲URLRequest對象,在建立Request對象時使用

這兩個協議抽象了URL與URLRequest,使得建立請求時再也不侷限於必須使用這兩個對象來初始化,可使用任意符合兩個協議的對象便可,方便上層封裝解耦。github

URLConvertible協議

協議很簡單,只有一個方法,遵循該協議的對象只須要實現一個方法,生成一個URL便可。而且該方法能夠拋出異常,拋出異常時,Alamofire會中止請求並返回AFError.invalidURL的錯誤。swift

public protocol URLConvertible {
    func asURL() throws -> URL
}
複製代碼

Alamofire內部定義遵循該協議的對象:

  • String:返回URL(string: self),爲空時拋出錯誤
  • URL:返回自身,不會拋出錯誤
  • URLComponents:返回self.url,爲空時拋出錯誤

自定義使用

若須要自定義建立url的規則(host,統一路徑,基於不一樣接口的不一樣路徑等需求)能夠本身實現類/結構體,而後遵循該協議,返回自定義拼接的url便可api

URLRequestConvertible協議

該協議相似URLConvertible,也是隻有一個方法,不過生成的是URLRequest對象。也能夠拋出錯誤。markdown

public protocol URLRequestConvertible {
    func asURLRequest() throws -> URLRequest
}
//另外擴展了一下協議,添加了一個計算屬性,能夠快速獲取URLRequest,返回的是個可選值,若是拋出錯誤,會忽略錯誤並返回nil:
extension URLRequestConvertible {
    public var urlRequest: URLRequest? { try? asURLRequest() }
}
複製代碼

Alamofire內部定義遵循該協議的對象

只有URLRequest對象實現了該協議,返回自身:ide

extension URLRequest: URLRequestConvertible {
    public func asURLRequest() throws -> URLRequest { self }
}
複製代碼

自定義使用

相似於URLConvertible,須要本身建立URLRequest對象的話,oop

Alamofire中使用自定義封裝的類型建立URLRequest

  • HTTPMethod -> 請求方法
  • HTTPHeaders+HTTPHeader -> 請求頭
  • URLConvertible -> 請求地址

使用三個自定義類型來建立URLRequest,也能方便管理與擴展,所以擴展了URLRequest對象,添加了使用這三個類型來初始化的方法,方法容許拋出錯誤,拋出錯誤時返回建立請求失敗的錯誤。post

extension URLRequest {
    public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws {
        let url = try url.asURL()

        self.init(url: url)

        httpMethod = method.rawValue
        allHTTPHeaderFields = headers?.dictionary
    }
}
複製代碼

總結

這兩個協議,通常是須要對Alamofire進行二次封裝(符合本身的業務邏輯需求)時會用到,對一些通用數據進行封裝,以及一些須要針對業務需求進行變動的數據進行處理。推薦一個基於Alamofire進行二次封裝的很棒的庫:Moya,github上12k+的星星,對Alamofire進行了二次封裝,把請求頭,請求參數,請求類型等業務相關的部分抽象成Provider協議,方便實現管理各類本身的api。並且還支持Rx,很好玩~有興趣的能夠看看。學習

相關文章
相關標籤/搜索