Alamoffireによるパッケージ-SwiftyNetwork
4746 ワード
Alamoffireというサードパーティネットワークを使ってフレームワークを要求する際に、使いやすいように二次パッケージを行いました.自分の考えでできるだけSwiftyに近づいてみてください.
アドレス
基本的な需要エニュメレート・インターフェース管理 エニュメレーションを用いて、Errタイプ管理 を行う.エニュメレーションを用いた状態コード管理 サポート要求ヘッドバンドtoken カスタム応答体の構造 は、汎型を用いて直接モデルのインスタンス に戻る.
ファイル構造
ポート
ステータスコード
エラー
応答体
共通要求ヘッダ設定
主な方法
処理に成功する
エラー処理
締め括りをつける
中にはカスタムのところがたくさんあります.これは勉強する時に書いた二回パッケージです.ここではパッケージを提供するだけです.参考にしてください.私の能力は限られています.皆さんはいい考えを持っています.
アドレス
基本的な需要
ファイル構造
|____Network-ResponseBody.swift
|____Network-Error.swift
|____Network-external.swift
|____Network-StatusCode.swift
|____Network-internal.swift
|____Network-Port.swift
例Network.default.testGet { (result) in
switch result {
case .success(let m):
print(m)
case .failure(let err):
print(err)
}
}
詳細な方法ポート
extension Network {
enum Port: String {
static let baseUrl = "http://www.mocky.io"
case testGet = "/v2/5bd6ab833500004900fd7c63"
}
}
extension Network.Port {
func string() -> String {
return Network.Port.baseUrl + rawValue
}
}
バックグラウンドからのインターフェースによってここを修正する必要があります.ステータスコード
extension Network {
enum Statuscode: Int, Decodable {
case success = 200
case frequently = 400
case authenticationError = 401
case failed = 500
init(rawValue: Int) {
switch rawValue {
case 200...299:
self = .success
case 400:
self = .frequently
case 401...499:
self = .authenticationError
default:
self = .failed
}
}
}
}
Swiftエニュメレーションを通じて、状態コードに具体的な意味を与える.エラー
enum NetworkError: Error {
case `default`
case jsonDeserialization
case frequentlyError
case authorizationError
}
ここでは必要に応じてエラーを追加できます.識別と処理が便利ですが、状態コードと一緒に使用する必要があります.応答体
extension Network {
struct ResponseBody: Decodable {
let code: Statuscode
let data: T
let info: String
}
}
バックグラウンドとの協議によって、最終的に定められた情報フォーマットの一つは、data
がDecodable
に準拠していなければならないことに留意されたい.共通要求ヘッダ設定
///
private func commonHeaders(headers: HTTPHeaders?) -> HTTPHeaders {
var newHeaders: HTTPHeaders = [:]
if headers != nil {
newHeaders = headers!
}
if let tk = token {
newHeaders["Authorization"] = tk
}
return newHeaders
}
ここには共通の要求ヘッダ情報が配置されており、ここではデフォルトでtoken
が追加されている.主な方法
/// Data API
func request(
url: Port,
method: HTTPMethod,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil,
completion: @escaping requestCompletion) {
UIApplication.shared.isNetworkActivityIndicatorVisible = true
let urlStr = url.string()
Alamofire.request(
urlStr,
method: method,
parameters: parameters,
encoding: encoding,
headers: commonHeaders(headers: headers)).responseData { (response) in
UIApplication.shared.isNetworkActivityIndicatorVisible = false
switch response.result {
case .success(let data):
self.successHandle(data: data, completion: completion)
case .failure(_):
self.failureHandle(completion: completion)
}
}
}
自分で書いたすべてのネットワーク要求方法はここに振り込まれるべきであり、次いでここでAlamofire
のネットワーク要求方法を呼び出して動作する.処理に成功する
private func successHandle(data: Data, completion: requestCompletion) {
do {
guard let body = try? JSONDecoder().decode(ResponseBody.self, from: data) else {
throw NetworkError.jsonDeserialization
}
switch body.code {
case .success:
completion(Result.success(body.data))
case .frequently:
throw NetworkError.frequentlyError
default:
throw NetworkError.default
}
} catch(let error) {
if let err = error as? NetworkError {
completion(Result.failure(err))
}
}
}
ここでは、ネットワーク要求が成功したら呼び出す方法です.バックグラウンドの戻りフォーマットが正しいかどうかを先に判断して、状態コードの処理を行います.ここで最も重要なことは、Swift
の汎型プログラミングを利用して、Decodable
を逆順序化し、フィードバックするときに、オブジェクトのインスタンスを直接に返すことができ、逆順序付け操作を行う必要がない.エラー処理
private func failureHandle(completion: requestCompletion) {
completion(Result.failure(NetworkError.default))
}
ここは普通のエラーに対する注文の折り返しです.締め括りをつける
中にはカスタムのところがたくさんあります.これは勉強する時に書いた二回パッケージです.ここではパッケージを提供するだけです.参考にしてください.私の能力は限られています.皆さんはいい考えを持っています.