Swift - moya学习笔记

本文主要是练习Moya的熟练使用

简单的网络请求

1.创建baseTargetType

主要是添加了baseUrl省去了每次创建接口都要写的步骤

extension TargetType {
    public var baseURL: URL {
        return URL(string: "https://api.github.com/")!
    }
}

2.创建接口

enum Github {
    case repositories(q: String, sort: String)
}

3.拓展接口

extension Github: TargetType {
    var path: String {
        switch self {
        case .repositories:
            return "search/repositories"
        }
    }

    var method: Moya.Method {
        switch self {
        case .repositories:
            return .get
        }
    }

    var parameters: [String: Any]? {
        switch self {
        case .repositories(let q, let sort):
            return ["q": q,
                "sort": sort]
        }
    }

    var parameterEncoding: ParameterEncoding {
        return URLEncoding.default
    }

    var task: Task {
        return .request
    }

    var sampleData: Data {
        switch self {
        case .repositories:
            return "".utf8Encoded
        }
    }
}

extension String {
    var urlEscaped: String {
        return self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
    }

    var utf8Encoded: Data {
        return self.data(using: .utf8)!
    }
}

参数说明

  • path 就是API的地址了(该demo完整的URL是https://api.github.com/search/repositories?q=javascript&sort=stars)
  • method 请求的方式:get/post
  • parameters API参数,以Map形式提交
  • parameterEncoding 参数的格式
  • task 该条请API求的方式,request、upload、download
  • sampleData 这个是做单元测试模拟的数据,必须要实现,只在单元测试文件中有作用

4.创建一个Provider

let GithubRxProvicer = RxMoyaProvider<Github>(plugins: [NetworkLoggerPlugin(verbose: true, responseDataFormatter: JSONResponseDataFormatter),
                                                        networkActivityPlugin])

private func JSONResponseDataFormatter(_ data: Data) -> Data {
    do {
        let dataAsJSON = try JSONSerialization.jsonObject(with: data)
        let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
        return prettyData
    } catch {
        return data //fallback to original data if it cant be serialized
    }
}
let networkActivityPlugin = NetworkActivityPlugin { (change) -> () in
    switch(change) {
    case .ended:
        UIApplication.shared.isNetworkActivityIndicatorVisible = false

    case .began:

        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    }
}

补充

Moya在初始化Provider的时候可以传入一些插件,Moya库中默认有4个插件。

  • AccessTokenPlugin 管理AccessToken的插件
  • CredentialsPlugin 管理认证的插件
  • NetworkActivityPlugin 管理网络状态的插件
  • NetworkLoggerPlugin 管理网络log的插件

且,自己也可以创建plugin;比如:

class RequestAlertPlugin: PluginType {

    private let viewController: UIViewController

    init(viewController: UIViewController) {
        self.viewController = viewController
    }

    func willSend(request: RequestType, target: TargetType) {
        //do your things
    }

    func didReceive(result: Result<Response, MoyaError>, target: TargetType) {
        guard case Result.failure(_) = result else { return }//只监听失败

        // do your things
    }
}

5.使用

GithubRxProvicer.request(.repositories(q: "javascript", sort: "stars"))
            .mapResponseToObject(type: Repositorie.self)
            .subscribe { event in
                switch event {
                case .next(let data):
                    print(".next")
                case .error(let error):
                    print(error)
                case .completed:
                    print(".completed")
                }
            }
            .disposed(by: disposeBag)

补充

Moya也为我们提供了很多Observable的扩展,让我们能更轻松的处理MoyaResponse,常用的如下:

  • filter(statusCodes:) 过滤response状态码
  • filterSuccessfulStatusCodes() 过滤状态码为请求成功的
  • mapJSON() 将请求response转化为JSON格式
  • mapString() 将请求response转化为String格式

更多使用参考

可以参考这篇文章,里面很详细的介绍了moya的各种用法

猜你喜欢

转载自blog.csdn.net/a1018875550/article/details/77844794