美文网首页
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