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

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

一 、安裝配置

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

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

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

二、數據請求樣例

1,效果圖

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

2,網絡請求層

? ? ? ? 我們先創建一個 DouBanAPI.swift 文件作為網絡請求層,里面的內容如下:

  • 首先定義一個 provider,即請求發起對象。往后我們如果要發起網絡請求就使用這個 provider。
  • 接著聲明一個 enum 來對請求進行明確分類,這里我們定義兩個枚舉值分別表示獲取頻道列表、獲取歌曲信息。
  • 最后讓這個 enum 實現 TargetType 協議,在這里面定義我們各個請求的 url、參數、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
    }
     
    //請求任務事件(這里附帶上參數)
    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
        }
    }
     
    //是否執行Alamofire驗證
    public var validate: Bool {
        return false
    }
     
    //這個就是做單元測試模擬的數據,只會在單元測試文件中有作用
    public var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }
     
    //請求頭
    public var headers: [String: String]? {
        return nil
    }
}

3,使用樣例

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

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

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

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容