えいむーさんは明日も頑張るよ

AlamofireのAdvancedUsageについて

価格

# Alamofire

# Session

Sessionのデフォルト値であるSession.defaultAFというEnumで与えられる。

なので、以下のコードは等価である。

AF.request("https://httpbin.org/get")

let session = Session.default
session.request("https://httpbin.org/get")

Session は様々なカスタマイズに対応している。Sessionのイニシャライザに与えられる全ての引数は以下のようになる。

public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default,
                        delegate: SessionDelegate = SessionDelegate(),
                        rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.session.rootQueue"),
                        startRequestsImmediately: Bool = true,
                        requestQueue: DispatchQueue? = nil,
                        serializationQueue: DispatchQueue? = nil,
                        interceptor: RequestInterceptor? = nil,
                        serverTrustManager: ServerTrustManager? = nil,
                        redirectHandler: RedirectHandler? = nil,
                        cachedResponseHandler: CachedResponseHandler? = nil,
                        eventMonitors: [EventMonitor] = [])

# Configuration (opens new window)

URLSessionのカスタマイズが可能。

例えばモバイル回線での通信を許可しないような設定にするのであれば、

let configuration = URLSessionConfiguration.af.default
configuration.allowsCellularAccess = false

let session = Session(configuration: configuration)

とすればよい。

ただし、URLSessionConfigurationAuthorizationContent-Typeを設定することは推奨されない。これらの値はParameterEncoderRequestAdaptorで解決すべきである。

# Delegate (opens new window)

# StartRequestImmediately

デフォルトではSessionは応答ハンドラに一つ以上のリクエストが追加されると直ちにresume()を自動で実行してリクエストを処理しますが、falseにすると全て手動でresume()を実行しなければいけないようになる。

# Queue

デフォルトではSessionは全ての非同期の仕組みを一つのDispatchQueueで処理しているが、手動でそれぞれにDispatchQueueを割り当てることができる。

rootQueueは必ずシリアルキューでなければならないがrequestQueueserializationQueueはパラレルキューも利用可能である。

# Interceptor

InterceptorRequestAdapterRequestRetrierが合わさったもので、リクエスト前にリクエストに手を加えたり、エラー発生してリトライ時にリトライの処理を実装することができる。

# ServerTrustManager

サーバを信頼する証明書がどうのこうののマネージャ。使わないので今回は割愛。

# RedirectHandler

HTTP のリダイレクトレスポンスをカスタマイズするプロトコル。これも使わないので今回は割愛。

# CachedResponseHandler

# EventMonitors

Alamofire の内部イベントを上手い具合に弄れる仕組み。Delegateに近いかなと思っているのだが、そういうわけではないらしい。

let monitor = ClosureEventMonitor()
monitor.requestDidCompleteTaskWithError = { (request, task, error) in
    debugPrint(request)
}
let session = Session(eventMonitors: [monitor])

# EventMonitor

使うことは稀だと思うのだが、以下のようなことができる。

# 全てのリクエストを止める

let session = ... // Some Session.
session.withAllRequests { requests in
    requests.forEach { $0.suspend() }
}

# 全てのリクエストをキャンセル

let session = ... // Some Session.
session.cancelAllRequests(completingOn: .main) { // completingOn uses .main by default.
    print("Cancelled all requests.")
}

# URLSession

let rootQueue = DispatchQueue(label: "org.alamofire.customQueue")
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.underlyingQueue = rootQueue
let delegate = SessionDelegate()
let configuration = URLSessionConfiguration.af.default
let urlSession = URLSession(configuration: configuration,
                            delegate: delegate,
                            delegateQueue: queue)
let session = Session(session: urlSession, delegate: delegate, rootQueue: rootQueue)

価格
    えいむーさんは明日も頑張るよ © 2022