美文网首页
Swift - RxMoya 基本设置

Swift - RxMoya 基本设置

作者: EE_L | 来源:发表于2017-07-03 17:27 被阅读409次

通过HTTPHeader设置公共请求参数

在实际开发中我们可能会需要在请求头内添加一些公共请求参数,如用于识别一些平台标志、辨别接口的版本号。你可以定义一个Endpoint的闭包.

let endpointClosure = { (target: T) -> Endpoint<T> in

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

let endpoint = Endpoint<T>(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<APIManager>(endpointClosure: endpointClosure)

通过插件的方式监听网络状态

通常我们会在进行网络请求的时候进行一些状态展示,如loading,那么你可以通过插件的方式来实现。Moya默认有4个插件:

AccessTokenPlugin 管理AccessToken的插件

CredentialsPlugin 管理认证的插件

NetworkActivityPlugin 管理网络状态的插件

NetworkLoggerPlugin 管理网络log的插件

在这里就演示一下NetworkActivityPlugin的使用:

    let networkPlugin = NetworkActivityPlugin { (type) in
    switch type {
    case .began:
        print("显示loading")
    case .ended:
        print("隐藏loading")
    }
}

同样在创建请求的Provider把它添加上去即可

 let provider = RxMoyaProvider<APIManager>(plugins:[networkPlugin]) 

当然你也可以自定义一些功能的插件,只需要实现PluginType协议,具体功能实现可参考Moya默认的插件:

final class CustomPlugin: PluginType {
  // MARK: Plugin
}

设置接口的超时时间

一般网络的请求需要根据具体的业务接口设置合适的超时时间,你可以参照一下方法进行设置

    let requestClosure = { (endpoint: Endpoint<T>, done: @escaping MoyaProvider<T>.RequestResultClosure) in
    guard var request = endpoint.urlRequest else { return }
    request.timeoutInterval = 30    //设置请求超时时间
    done(.success(request))
}

同样在创建请求的Provider把它添加上去即可

let provider = RxMoyaProvider<APIManager>(requestClosure: requestClosure)

最后,这些设置最好用一个 struct 去管理.

Example:

struct HttpArgument<T: TargetType> { 
    let endpointClosure = .....
    let requestClosure = ......
    let networkPlugin = ......
    let accessTokenPlugin = .....
}

使用的时候

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

相关文章

网友评论

      本文标题:Swift - RxMoya 基本设置

      本文链接:https://www.haomeiwen.com/subject/fakzcxtx.html