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
        }
    }
    
    バックグラウンドとの協議によって、最終的に定められた情報フォーマットの一つは、dataDecodableに準拠していなければならないことに留意されたい.
    共通要求ヘッダ設定
    ///      
    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))
    }
    
    ここは普通のエラーに対する注文の折り返しです.
    締め括りをつける
    中にはカスタムのところがたくさんあります.これは勉強する時に書いた二回パッケージです.ここではパッケージを提供するだけです.参考にしてください.私の能力は限られています.皆さんはいい考えを持っています.