Swift - RxSwift的使用詳解49(結(jié)合Moya使用1:數(shù)據(jù)請求)

???? Moya 是一個基于 Alamofire 的更高層網(wǎng)絡請求封裝抽象層唆迁。它可以對我們項目中的所有請求進行集中管理,方便開發(fā)與維護。同時 Moya 自身也提供了對 RxSwift 的擴展,通過與 RxSwift 的結(jié)合影钉,能讓 Moya 變得更加強大。下面我就通過樣例演示如何使用“RxSwift + Moya”這個組合進行開發(fā)掘剪。

一 平委、安裝配置

? ? ? ? 航哥之前也寫過關(guān)于 Moya 的文章(點擊查看),當時是通過 CocoaPods 來進行安裝配置夺谁。這次改用手動配置作為演示廉赔。

(1)首先將需要用到的庫下載到本地:

(2)接著在項目中引入并配置即可。

二匾鸥、數(shù)據(jù)請求樣例

1蜡塌,效果圖

? ? ? ? 我們使用 Moya 調(diào)用豆瓣 FMAPI 接口,獲取所有的頻道列表并輸出到控制臺中勿负。

2馏艾,網(wǎng)絡請求層

? ? ? ? 我們先創(chuàng)建一個 DouBanAPI.swift 文件作為網(wǎng)絡請求層,里面的內(nèi)容如下:

  • 首先定義一個 provider,即請求發(fā)起對象琅摩。往后我們?nèi)绻l(fā)起網(wǎng)絡請求就使用這個 provider铁孵。
  • 接著聲明一個 enum 來對請求進行明確分類,這里我們定義兩個枚舉值分別表示獲取頻道列表房资、獲取歌曲信息蜕劝。
  • 最后讓這個 enum 實現(xiàn) TargetType 協(xié)議,在這里面定義我們各個請求的 url轰异、參數(shù)岖沛、header 等信息。
import Foundation
import Moya
import RxMoya
 
//初始化豆瓣FM請求的provider
let DouBanProvider = MoyaProvider<DouBanAPI>()
 
/** 下面定義豆瓣FM請求的endpoints(供provider使用)**/
//請求分類
public enum DouBanAPI {
    case channels  //獲取頻道列表
    case playlist(String) //獲取歌曲
}
 
//請求配置
extension DouBanAPI: TargetType {
    //服務器地址
    public var baseURL: URL {
        switch self {
        case .channels:
            return URL(string: "https://www.douban.com")!
        case .playlist(_):
            return URL(string: "https://douban.fm")!
        }
    }
     
    //各個請求的具體路徑
    public var path: String {
        switch self {
        case .channels:
            return "/j/app/radio/channels"
        case .playlist(_):
            return "/j/mine/playlist"
        }
    }
     
    //請求類型
    public var method: Moya.Method {
        return .get
    }
     
    //請求任務事件(這里附帶上參數(shù))
    public var task: Task {
        switch self {
        case .playlist(let channel):
            var params: [String: Any] = [:]
            params["channel"] = channel
            params["type"] = "n"
            params["from"] = "mainsite"
            return .requestParameters(parameters: params,
                                      encoding: URLEncoding.default)
        default:
            return .requestPlain
        }
    }
     
    //是否執(zhí)行Alamofire驗證
    public var validate: Bool {
        return false
    }
     
    //這個就是做單元測試模擬的數(shù)據(jù)搭独,只會在單元測試文件中有作用
    public var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }
     
    //請求頭
    public var headers: [String: String]? {
        return nil
    }
}

3婴削,使用樣例

(1)我們在視圖控制器中通過上面的定義的 provider 即可發(fā)起請求,獲取數(shù)據(jù)戳稽。具體代碼如下:

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //獲取數(shù)據(jù)
        DouBanProvider.rx.request(.channels)
            .subscribe { event in
                switch event {
                case let .success(response):
                    //數(shù)據(jù)處理
                    let str = String(data: response.data, encoding: String.Encoding.utf8)
                    print("返回的數(shù)據(jù)是:", str ?? "")
                case let .error(error):
                    print("數(shù)據(jù)請求失敗!錯誤原因:", error)
                }
            }.disposed(by: disposeBag)
        }
}

(2)訂閱相關(guān)的代碼還可以換種方式寫:

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
 
     let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //獲取數(shù)據(jù)
        DouBanProvider.rx.request(.channels)
            .subscribe(onSuccess: { response in
                //數(shù)據(jù)處理
                let str = String(data: response.data, encoding: String.Encoding.utf8)
                print("返回的數(shù)據(jù)是:", str ?? "")
            },onError: { error in
                print("數(shù)據(jù)請求失敗!錯誤原因:", error)
            }).disposed(by: disposeBag)
    }
}

RxSwift使用詳解系列
原文出自:www.hangge.com轉(zhuǎn)載請保留原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市期升,隨后出現(xiàn)的幾起案子惊奇,更是在濱河造成了極大的恐慌,老刑警劉巖播赁,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颂郎,死亡現(xiàn)場離奇詭異,居然都是意外死亡容为,警方通過查閱死者的電腦和手機乓序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坎背,“玉大人替劈,你說我怎么就攤上這事〉寐耍” “怎么了陨献?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長懂更。 經(jīng)常有香客問我眨业,道長,這世上最難降的妖魔是什么沮协? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任龄捡,我火速辦了婚禮,結(jié)果婚禮上慷暂,老公的妹妹穿的比我還像新娘聘殖。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布就斤。 她就那樣靜靜地躺著悍募,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洋机。 梳的紋絲不亂的頭發(fā)上坠宴,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音绷旗,去河邊找鬼喜鼓。 笑死,一個胖子當著我的面吹牛衔肢,可吹牛的內(nèi)容都是我干的庄岖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼角骤,長吁一口氣:“原來是場噩夢啊……” “哼隅忿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邦尊,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤背桐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蝉揍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體链峭,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年又沾,在試婚紗的時候發(fā)現(xiàn)自己被綠了弊仪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡杖刷,死狀恐怖励饵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滑燃,我是刑警寧澤曲横,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站不瓶,受9級特大地震影響禾嫉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚊丐,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一熙参、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麦备,春花似錦孽椰、人聲如沸昭娩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栏渺。三九已至,卻和暖如春锐涯,著一層夾襖步出監(jiān)牢的瞬間磕诊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工纹腌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霎终,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓升薯,卻偏偏與公主長得像莱褒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涎劈,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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