Alamofireソースコード分析(一)---Alamofire.swift

2808 ワード

Alamofire.swiftは、ネットワークリクエストの呼び出しにインタフェースを提供し、いくつかのツールメソッドを提供します.
1.2つのプロトコルURLConvertibleとURLRequestConvertible
この2つのプロトコルは、他のタイプがURLまたはURLRequestタイプに変換され、要求を送信して使用するのに便利なツール方法を提供します.
public protocol URLConvertible {
    func asURL() throws -> URL
}

public protocol URLRequestConvertible {
    func asURLRequest() throws -> URLRequest
}


この2つのプロトコルは、それぞれ対応するタイプを生成する方法を定義します.このプロトコルを他のタイプに継承させ、この方法を実装します.ocを書く習慣とは異なり、以前はocを書くときにクラスにcategoryを直接付けるのが一般的でしたが、ここではprotocolを定義し、拡張が必要なタイプにプロトコルを継承させる方法を使用しています.
関数の戻り値には、関数がエラーを投げ出すことができることを示すキーワードthrowsがあることに注意してください.throwsキーが付いた関数をthrowing関数と呼びます.この関数は戻り値のタイプを示すため、throwsキーワードは矢印(->)の前に書く必要があります.throwing関数は内部でエラーを投げ出し、エラーを関数が呼び出された場所に渡すことができます.
Stringの方法で実現する
extension String: URLConvertible {
    public func asURL() throws -> URL {
        guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }
        return url
    }
}

URL(string:self)メソッドに異常が発生すると、AFErrorエラーが放出されます.この方法では例外が投げ出される可能性があるので,呼び出し時にtryキーを先に付け,最終的には外層に包まれたDo-Catchによって例外のさらなる処理をキャプチャする.
例えば空の文字列でrequest,Alamofireを作成します.request("")、呼び出しは次のコードに進みます.
    do {
       originalRequest = try URLRequest(url: url, method: method, headers: headers)
       let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
       return request(encodedURLRequest)
   } catch {
       return request(originalRequest, failedWith: error)
   }

URLRequestメソッドの作成時にStringのasURLメソッドが呼び出され、AFError例外が投げ出されます.この場合、コードはcatchに移動します.
2.フレーム入口
ここではrequest,donwload,uploadの方法を提供します.をクリックして、データの取得、ダウンロード、アップロードのrequestを作成します.彼らは異なるパラメータの初期化方法を提供し、SessionManagerを呼び出すことによってdefaultで作成します.その後、ResponseSerialization内のresponseStringメソッドを呼び出すことでリクエストを送信し、処理します.
    Alamofire.request("https://httpbin.org/get").responseString{ response in
       print("result = \(response.result)");
       print("response = \(String(describing: response.response))");
   }

3.URLSessionベース
iOS 7以前のNSURLConnectionは、NSURLSession、NSURLSessionConfiguration、およびNSURLSessionTaskの3つのサブクラス:NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTaskに置き換えられました.
NSURLConnectionと比較して、NSURLsessionの最も直接的な改善は、各sessionのキャッシュ、プロトコル、クッキーを構成できることです.証明書ポリシー(credential policy)は、プログラム間でこれらの情報を共有することもできます.これにより、プログラムとネットワークインフラストラクチャの間で互いに独立し、干渉が発生しません.各NSURLSessionオブジェクトは、NSURLSessionConfigurationオブジェクトによって初期化され、後者は、さっき提案したポリシーとモバイルデバイスのパフォーマンスを向上させるための新しいオプションを指定します.
NSURLSessionのもう一つの大きなブロックはsession taskです.データのロードと、クライアントとサービス・エンド間のファイルとデータのアップロードとダウンロードを処理します.NSURLSessionTaskとNSURLConnectionの最大の類似点は、データのロードも担当することであり、最大の違いは、すべてのtaskがその創造者NSURLSessionという共通の依頼者(common delegate)を共有することである.