基于Swift4.0的RxMoya + ObjectMapper

本文主要是為了最新版本的Moya使用

RxMoya簡

Moya是一個基于Alamofire的Networking library舞丛,對你沒看錯就是對Alamofire的一個封裝寂拆。而RxMoya 就是為RxSwift 提供的一個擴展虱黄。

Moya使用

下面我們來舉個栗子筹麸,以請求一個妹子圖功能的接口獲取數(shù)據(jù)

第一步

首先定義一個 enum 來對我們請求的功能進行明確的分類。

enum MZTAPI {
  case GetMz // 這里就是我們要實現(xiàn)的功能獲取妹子
}

然后我們需要讓這個enum遵守TargetType協(xié)議暑始,在這個協(xié)議中可以看到 TargetType定義了我們發(fā)送一個網(wǎng)絡(luò)請求所需要的東西伴鳖。

extension MZTAPI: TargetType {
    
    var baseURL: URL {
       // 請求的根路徑
        return  URL.init(string: "https://api.isoyu.com/index.php")!
    }
    
    var path: String {
        
        // 一般一個API文件中有多個請求,那么就會有多個請求路徑
        // 這里就這樣寫
        switch self {
        case .GetMz:
            return "/api/Picture/hua_ban"
    
        }
        
    }
    
    var method: Method {
        
        // 這里 同 path 一樣的道理
        switch self {
        case .GetMz:
            return .get
        }
    }
    
    var sampleData: Data {
        
        // 這里是單元測試數(shù)據(jù)锯梁,如果不需要寫單元測試這里就可以管,但是必須要實現(xiàn)
        return "".data(using: String.Encoding.utf8)!
    }
    
    var task: Task {
        
        // 在swfit4.0 中Moya 需要在這里為每個請求添加接口參數(shù)
        switch self {
        case .GetMz:
            return .requestPlain // 這里代表不需要請求參數(shù)
        }
    }
    
    var headers: [String : String]? {
        
        return nil
    }
}

到這里后就可以去發(fā)送一個請求了

先定義一個 Provider

let zmtProvider = MoyaProvider<MZTAPI>.init(plugins: [NetworkLoggerPlugin.init(verbose: true, responseDataFormatter: JSONResponseDataFormatter)])

在定義Provider的時候可以傳入多個參數(shù) 大家有興趣可以點進去看看

然后用這個Provider去請求數(shù)據(jù)

zmtProvider.request(.GetMz) { (result) in
          
            switch result {
            case let .success(response):
                 print(response)
                break
            case  let .failure(error):
                print(error)
                break
            
            }
        }

到這里就搞定了Moya的請求即碗,下一步就是把請求回來的數(shù)據(jù)轉(zhuǎn)換成模型我們就可以使用了。

ObjectMapper的使用

在上面的操作中我們已經(jīng)得到j(luò)son數(shù)據(jù)了陌凳,想要使用還需要一步轉(zhuǎn)模型剥懒。

import Foundation
import ObjectMapper

class MZTModel: Mappable {
    
    var repin_count:Int?
    var img:String?
    var title:String?
    var desc:String?
    var like:Int?
    
    required init?(map: Map) {
        
    }
    func mapping(map: Map) {
        /**
         
         "repin_count" : 33,
         "img" : "http:\/\/img.hb.aicdn.com\/615e9d15b7da715ca299495204a74e1813d5eff711355d-gCijNw",
         "title" : "清新如詩",
         "desc" : "",
         "like" : 11
         */
        repin_count <- map["repin_count"]
        img <- map["img"]
        title <- map["title"]
        desc <- map["desc"]
        like <- map["like"]
    }
}

ObjectMapper 和MJExtension差不 我就不詳細介紹了
模型類繼承 Mappable 然后實現(xiàn) 必要的 2個協(xié)議就可以了,
把JSON 轉(zhuǎn)為 Model 對象:

let mztModel = MZTModel(JSONString: JSONString)

把 Model 對象轉(zhuǎn)為 JSON 字符串:

let jsonsString = mztModel.toJSONString(prettyPrint: true)

RxMoya + ObjectMapper配合使用

self.provider.rx.request(.GetMz)
            .mapJSON().asObservable().mapArray(type: MZTModel.self)
                .subscribe(onNext: { (model) in
                    
                    if event.element! {
                        self.modelObserable.value = model
                        self.refreshobserable.value = .endHeaderRefresh
                    }
                    else {
                        self.modelObserable.value += model
                        self.refreshobserable.value = .endFooterRefresh
                    }
                    
                }, onError: { (error) in
                    if event.element! {
                        
                        self.refreshobserable.value = .endHeaderRefresh
                    }
                    else {                        
                        self.refreshobserable.value = .endFooterRefresh
                    }
                    
                }, onCompleted: nil, onDisposed: nil)
            .disposed(by: self.bag)

rx.request(.GetMz)來請求接口合敦、 .mapJSON用于把請求的數(shù)據(jù)序列化, .asObservable().mapArray這里就開始轉(zhuǎn)模型了初橘, 最后.subscribe這里是訂閱前面的事件流序列,這里是RxSwift 中相關(guān)的用法。
文章中只貼出了部分用法充岛,更多內(nèi)容請參考Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末保檐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崔梗,更是在濱河造成了極大的恐慌夜只,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜魄,死亡現(xiàn)場離奇詭異扔亥,居然都是意外死亡,警方通過查閱死者的電腦和手機谈为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門砸王,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峦阁,你說我怎么就攤上這事≡懦桑” “怎么了榔昔?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘪菌。 經(jīng)常有香客問我撒会,道長,這世上最難降的妖魔是什么师妙? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任诵肛,我火速辦了婚禮,結(jié)果婚禮上默穴,老公的妹妹穿的比我還像新娘怔檩。我一直安慰自己褪秀,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布薛训。 她就那樣靜靜地躺著媒吗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乙埃。 梳的紋絲不亂的頭發(fā)上闸英,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音介袜,去河邊找鬼甫何。 笑死,一個胖子當著我的面吹牛遇伞,可吹牛的內(nèi)容都是我干的辙喂。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赃额,長吁一口氣:“原來是場噩夢啊……” “哼加派!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跳芳,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤芍锦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后飞盆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娄琉,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年吓歇,在試婚紗的時候發(fā)現(xiàn)自己被綠了孽水。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡城看,死狀恐怖女气,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情测柠,我是刑警寧澤炼鞠,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站轰胁,受9級特大地震影響谒主,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赃阀,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一霎肯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦观游、人聲如沸搂捧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽异旧。三九已至,卻和暖如春提佣,著一層夾襖步出監(jiān)牢的瞬間吮蛹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工拌屏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潮针,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓倚喂,卻偏偏與公主長得像每篷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子端圈,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350