Swift moya - 學(xué)習(xí)筆記

本文主要是練習(xí)Moya的熟練使用

簡單的網(wǎng)絡(luò)請求

1.創(chuàng)建baseTargetType

主要是添加了baseUrl省去了每次創(chuàng)建接口都要寫的步驟

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

2.創(chuàng)建接口

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)!
    }
}

參數(shù)說明

  • path 就是API的地址了(該demo完整的URL是https://api.github.com/search/repositories?q=javascript&sort=stars)
  • method 請求的方式:get/post
  • parameters API參數(shù),以Map形式提交
  • parameterEncoding 參數(shù)的格式
  • task 該條請API求的方式,request、upload、download
  • sampleData 這個(gè)是做單元測試模擬的數(shù)據(jù),必須要實(shí)現(xiàn),只在單元測試文件中有作用

4.創(chuàng)建一個(gè)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
    }
}

補(bǔ)充

Moya在初始化Provider的時(shí)候可以傳入一些插件,Moya庫中默認(rèn)有4個(gè)插件。

  • AccessTokenPlugin 管理AccessToken的插件
  • CredentialsPlugin 管理認(rèn)證的插件
  • NetworkActivityPlugin 管理網(wǎng)絡(luò)狀態(tài)的插件
  • NetworkLoggerPlugin 管理網(wǎng)絡(luò)log的插件

且,自己也可以創(chuàng)建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 }//只監(jiān)聽失敗

        // 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)

補(bǔ)充

Moya也為我們提供了很多Observable的擴(kuò)展,讓我們能更輕松的處理MoyaResponse,常用的如下:

  • filter(statusCodes:) 過濾response狀態(tài)碼
  • filterSuccessfulStatusCodes() 過濾狀態(tài)碼為請求成功的
  • mapJSON() 將請求response轉(zhuǎn)化為JSON格式
  • mapString() 將請求response轉(zhuǎn)化為String格式

更多使用參考

可以參考這篇文章,里面很詳細(xì)的介紹了moya的各種用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評論 25 709
  • 文章摘自Moya官方文檔 Targets Moya的使用始于定義一個(gè)target——典型的是定義一個(gè)符合Targe...
    Jt_Self閱讀 16,414評論 0 27
  • 【番茄打卡】 50個(gè)仰臥起坐 已然是常態(tài) 輕松加愉快 翻出一根繩 記不清年歲 踩一踩 丈量下長度 恩,還能跳 蹦嗒...
    崽崽獅子女閱讀 178評論 0 1
  • vue2有著深度繼承的路由插件,即:vue-router,其中文的API地址。 vue-router與其他的路由(...
    白水螺絲閱讀 17,683評論 0 17

友情鏈接更多精彩內(nèi)容