Moya使用董朝,看我就行了

Moya是一個在GitHub上Star10k加的框架了鸠项,相信他的實力已經(jīng)不言而喻了。

??筆者是一個次開始使用swift的OC開發(fā)者子姜,對于一些swift使用祟绊,還是很懵逼的。只能去慢慢探索吧哥捕。由于對Objective-C的使用牧抽,很多思維方式被限制了,使用起swift很蛋疼(個人感覺)遥赚。

??在下決定學(xué)習(xí)Moya之前扬舒,我已經(jīng)好多次翻看這個使用說明,然而都是中途放棄了??

然后我去下載了Moya庫凫佛,找到他們的中文文檔讲坎,雖然文檔很清晰,對于我這樣的才開始寫swift和接觸Moya的還是很茫然的愧薛。和Objective-C我參數(shù)傳進(jìn)去一個對象晨炕,返回結(jié)果也是一個對象,還是有很大出入的??毫炉。
Moya的中文文檔.png
開始閱讀瓮栗,我們從哪里開始開呢,當(dāng)然是從readme開始了
# 示例
* [基本用法](Basic.md)
* [Multipart upload](MultipartUpload.md)
* [Use MultiTarget for multiple Targets using the same Provider](MultiTarget.md)
* [資源下載設(shè)置](Assets.md)
* [Alamofire自動驗證](AlamofireValidation.md)
## 自定義Endpoints
* [可選的請求參數(shù)](OptionalParameters.md)
## 包裝適配器
* [把 **request -> result**流程碘箍,包裝到你自己的適配器中](WrappingInAdapter.md)
## 錯誤處理
* [處理不同錯誤類型](ErrorTypes.md)
## 插件
* [創(chuàng)建自定義插件](CustomPlugin.md)
* [創(chuàng)建授權(quán)插件](AuthPlugin.md)

我們一步一步的來先實現(xiàn)基本用法遵馆,然后再去完善成我們要求的那樣。

第一步:根據(jù)Moya的基本用法走一波

??跟著基本用法一步一步創(chuàng)建丰榴。我創(chuàng)建的文件名為NetworkTools.swift這個我用的是 干貨集中營的API货邓。
??我先創(chuàng)建一個NetworkTools的枚舉,然后這個枚舉必須遵循TargetType協(xié)議四濒,那我們來看看這個協(xié)議到底有哪些東西呢换况?包括如下的協(xié)議內(nèi)容:

/// 用于定義“MoyaProvider”所需規(guī)范的協(xié)議。
public protocol TargetType {
    /// 請求的 baseURL
    var baseURL: URL { get }
    /// 拼接 baseURL 成為完整的 URL 路徑 
    var path: String { get }
    /// 請求中使用的HTTP方法(一般為 .post和 .get)
    var method: Moya.Method { get }
    /// 提供用于測試的數(shù)據(jù) 
    var sampleData: Data { get }
    /// 要執(zhí)行的HTTP任務(wù)的類型盗蟆。
    var task: Task { get }
    /// 對請求執(zhí)行的驗證類型  默認(rèn)設(shè)置是 .none
    var validationType: ValidationType { get }
    /// 請求中header
    var headers: [String: String]? { get }
}
public extension TargetType {
    /// 對請求執(zhí)行的驗證類型  默認(rèn)設(shè)置是 .none
    var validationType: ValidationType {
        return .none
    }
}
我們更具他的協(xié)議戈二,寫一個簡單的Demo如下:
import UIKit
import Moya

let NetworkProvider = MoyaProvider<NetworkTools>()

enum NetworkTools {
    case today
}
extension NetworkTools: TargetType {
    var baseURL: URL {
         return URL(string: "http://gank.io/api/")!
    }
    var path: String {
       return "today"
    }
    var method: Moya.Method {
        return .get
    }
    var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }
    var task: Task {
        let parmeters = [String : Any]()
        return .requestParameters(parameters: parmeters, encoding: URLEncoding.default)
    }
    var headers: [String : String]? {
        let header = ["Content-Type" : "application/json; charset=utf-8"]
        return header
    }
}
在控制器中代碼如下
class MMPCollectionVC: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NetworkProvider.request(.today) { result in
            switch result {
            case let .success(moyaResponse):
                let data = moyaResponse.data
                let statusCode = moyaResponse.statusCode
                TSLog(data)
                TSLog(statusCode)
                do {
                    let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
                    TSLog(json)
                } catch {
                    TSLog(statusCode)
                }
                
            case let .failure(error):
                TSLog(error)
            }
        }
    }
}
打印部分結(jié)果
?? -[MMPCollectionVC.swift viewDidLoad() line:21] ?? 
 33772 bytes
?? -[MMPCollectionVC.swift viewDidLoad() line:22] ?? 
 200
?? -[MMPCollectionVC.swift viewDidLoad() line=25] ?? 
 {
    error = 0,
    results = {
        Android = [
            {
                used = 1,
                createdAt = "2018-12-04T06:44:18.364Z",
                images = [
                    "http://img.gank.io/0cd8baa4-7d96-40fb-ab0c-4b3668a7ac4d",
                    "http://img.gank.io/35066fc9-4c67-498d-b9e1-f8e3ca7410e1",
                    "http://img.gank.io/ad8b369e-c643-4631-afdd-4466aab4f7fd",
                    "http://img.gank.io/101d45df-c66b-4610-809a-734fbca99967",
                    "http://img.gank.io/d8755a02-fe71-4562-ac9f-4d7d6b0d3358",
                ],
                url = "https://github.com/yangchong211/YCVideoPlayer",
                publishedAt = "2019-02-13T03:26:06.640Z",
                who = "fingdo",
                _id = "5c0622429d2122308e7445cf",
                source = "web",
                type = "Android",
                desc = "一個基于ijkplayer的完整視頻播放器封裝,支持自定義喳资,拓展性強觉吭,已經(jīng)用于實際開發(fā)中",
            },
            {
                used = 1,
                createdAt = "2019-01-03T11:25:59.115Z",
                images = [
                    "https://ww1.sinaimg.cn/large/0073sXn7ly1fze96rdfhmg308w0ft7wh",
                    "https://ww1.sinaimg.cn/large/0073sXn7ly1fze96s6tdag308w0ftjvw",
                ],

2019年04月22日

HandyJSON 配合 Moya請求

在正常的網(wǎng)絡(luò)請求過程中,我們請求數(shù)據(jù)時仆邓,不想那么麻煩:
目標(biāo):1鲜滩、請求時傳入model 類型
???2伴鳖、返回數(shù)據(jù),直接返回傳入的model

下面代碼就是我登錄請求的例子:
我傳入 ZSLoginModel,
返回的時候就是ZSLoginModel

class ZSLoginViewModel: BaseViewModel {
    var loginModel: ZSLoginModel?
}

extension ZSLoginViewModel {
    func loginNetworking(params:[String: Any]) -> Void {
        loginProvider.rx.request(.login(params: params)).asObservable().mapModel(type: ZSLoginModel.self).subscribe { (event) in

            switch event {
            case .next(let model):
                self.loginModel = model
                ZSRealm_Tool.instance.saveLoginModel(model: model)
            case .completed:
                self.updataBlock?()
            case .error(let error):
                TSLog(error)
            }
            }.disposed(by: disposeBag)
    }
}

我們需要給ObservableType 和 Response 加寫擴展,我們就可以達(dá)到這個效果

import HandyJSON
import Moya
import RxSwift
import SwiftyJSON

/// 數(shù)據(jù) 轉(zhuǎn) 模型
extension ObservableType where E == Response {
    public func mapModel<T: HandyJSON>(type: T.Type)->Observable<T> {
        return flatMap { response -> Observable<T> in
            return Observable.just(response.mapModel(T.self))
        }
    }
}
/// 數(shù)據(jù) 轉(zhuǎn) 模型
extension Response {
    func mapModel<T: HandyJSON>(_ type: T.Type) -> T {
        let json = JSON(data)["result"].dictionaryObject
        return JSONDeserializer<T>.deserializeFrom(dict: json)!
    }
}

請求時徙硅,的加載動畫

我們往往會在加載的過程中榜聂,需要有一個加載的動畫(MBProgressHUDNVActivityIndicatorView都是不錯的選擇)
我們需要做的就是寫自己的插件。文檔中的CustomPlugin.md

/// 自定義插件
public final class NetworkLoadingPlugin: PluginType {
    public func willSend(_ request: RequestType, target: TargetType) {
        TSLog("開始請求")
    }
    public func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) {
        TSLog("請求結(jié)束")
    }
}

你可以把這個嗓蘑,和上面的擴展放到一起须肆,有助于你的管理

image.png

那么這樣,你就距離你理想的網(wǎng)絡(luò)請求有進(jìn)一步了桩皿,對于加載動畫豌汇,你可以根據(jù)你自己的需求寫入。然而筆者在這里留下了一個坑业簿,也是我讀文檔是瘤礁,遇到的。你是不是感覺didReceive這個方法沒有調(diào)用梅尤。你可以導(dǎo)入Result這個之后再試一試柜思。哈哈哈??

這樣可能還是不滿足我們的需求啊~那我就應(yīng)該繼續(xù)完善,不要慫O镌铩I呐獭!多讀幾遍缰揪,自然OK陨享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钝腺,隨后出現(xiàn)的幾起案子抛姑,更是在濱河造成了極大的恐慌,老刑警劉巖艳狐,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定硝,死亡現(xiàn)場離奇詭異,居然都是意外死亡毫目,警方通過查閱死者的電腦和手機蔬啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镀虐,“玉大人箱蟆,你說我怎么就攤上這事」伪悖” “怎么了空猜?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我辈毯,道長久信,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任漓摩,我火速辦了婚禮,結(jié)果婚禮上入客,老公的妹妹穿的比我還像新娘管毙。我一直安慰自己,他們只是感情好桌硫,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布夭咬。 她就那樣靜靜地躺著,像睡著了一般铆隘。 火紅的嫁衣襯著肌膚如雪卓舵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天膀钠,我揣著相機與錄音掏湾,去河邊找鬼。 笑死肿嘲,一個胖子當(dāng)著我的面吹牛融击,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雳窟,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼尊浪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了封救?” 一聲冷哼從身側(cè)響起拇涤,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎誉结,沒想到半個月后鹅士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搓彻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年如绸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旭贬。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡怔接,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稀轨,到底是詐尸還是另有隱情扼脐,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站瓦侮,受9級特大地震影響艰赞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肚吏,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一方妖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罚攀,春花似錦党觅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炫掐,卻和暖如春魁莉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背募胃。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工旗唁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痹束。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓逆皮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親参袱。 傳聞我的和親對象是個殘疾皇子电谣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件抹蚀、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評論 4 62
  • 嗯哼嗯哼蹦擦擦~~~ 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS 目錄 ...
    philiha閱讀 4,858評論 0 6
  • 有一天环壤,我在開車晒来,然而前面的一輛車開得非常慢,明明可以過去它卻在每一個十字路口都減速停下來郑现。 我就有點急了:“傻X...
    大汪志趣閱讀 782評論 1 1
  • 閉上眼一排五光十色的獠牙魔鬼湃崩,搖著牢門喊:“放我,放我出去接箫,別不管"藏起酒一碗攒读,藏起真心話我的呼吸比他的叫聲柔軟.
    琉璃012閱讀 245評論 2 3
  • 那天,我拖著行李箱辛友,和應(yīng)屆生一樣都帶著夢一般的理想來到了這個城市薄扁。深圳的冬天依舊陽光明媚,綠樹蔥蔥,花兒在微風(fēng)中努...
    逗逗小老虎閱讀 268評論 0 0