Swift-RxMoya基本設定

2914 ワード

HTTPHeaderによる共通要求パラメータの設定
実際の開発では、プラットフォームフラグの識別、インタフェースのバージョン番号の識別など、リクエストヘッダに共通のリクエストパラメータを追加する必要がある場合があります.Endpointの閉パッケージを定義できます
let endpointClosure = { (target: T) -> Endpoint in

let url = target.baseURL.appendingPathComponent(target.path).absoluteString

let endpoint = Endpoint(url: url, sampleResponseClosure: { 
   .networkResponse(200, target.sampleData) }, 
    method: target.method, 
    parameters: target.parameters, 
    parameterEncoding: target.parameterEncoding)
    
 return endpoint.adding(newHTTPHeaderFields: 
                        ["x-platform" : "iOS", 
                        "x-interface-version" : "1.0"])}

そしてリクエストを作成したProviderに追加します
let provider = RxMoyaProvider(endpointClosure: endpointClosure)

プラグインによるネットワーク状態のリスニング
通常、loadingのようなネットワークリクエストを行うときにステータス表示を行うと、プラグインで実現できます.Moyaのデフォルトには4つのプラグインがあります.
AccessTokenPlugin AccessTokenを管理するプラグイン
CredentialsPlugin管理認証プラグイン
NetworkActivity Pluginネットワークの状態を管理するプラグイン
NetworkLoggerPluginネットワークロゴを管理するプラグイン
NetworkActivity Pluginの使用方法を説明します.
    let networkPlugin = NetworkActivityPlugin { (type) in
    switch type {
    case .began:
        print("  loading")
    case .ended:
        print("  loading")
    }
}

同じようにリクエストを作成したProviderに追加すればよい
 let provider = RxMoyaProvider(plugins:[networkPlugin]) 

もちろん、いくつかの機能のプラグインをカスタマイズすることもできます.PluginTypeプロトコルを実装するだけで、具体的な機能実装はMoyaのデフォルトのプラグインを参照することができます.
final class CustomPlugin: PluginType {
  // MARK: Plugin
}

インタフェースのタイムアウト時間の設定
一般的なネットワークのリクエストは、特定のビジネスインタフェースに基づいて適切なタイムアウト時間を設定する必要があります.方法を参照して設定してください.
    let requestClosure = { (endpoint: Endpoint, done: @escaping MoyaProvider.RequestResultClosure) in
    guard var request = endpoint.urlRequest else { return }
    request.timeoutInterval = 30    //        
    done(.success(request))
}

同じようにリクエストを作成したProviderに追加すればよい
let provider = RxMoyaProvider(requestClosure: requestClosure)

最後に、これらの設定は1つのstructで管理することが望ましい.
Example:
struct HttpArgument { 
    let endpointClosure = .....
    let requestClosure = ......
    let networkPlugin = ......
    let accessTokenPlugin = .....
}

使用時
   private lazy var provider: RxMoyaProvider = { () -> RxMoyaProvider in
    let argument = HttpArgument()
    let provider = RxMoyaProvider(endpointClosure: argument.endpointClosure,
                                            plugins:[argument.networkPlugin])
    
    return provider
}()