Moya+RxSwift實(shí)現(xiàn)簡(jiǎn)單個(gè)網(wǎng)絡(luò)請(qǐng)求框架

代碼簡(jiǎn)單 ? (解析數(shù)據(jù)使用ObjectMapper+SwiftyJSON)

首先寫個(gè)遵循自Moya的TargetType協(xié)議的枚舉

import Moya

import Result

import RxSwift

import ObjectMapper

import SwiftyJSON

import MBProgressHUD


fileprivate let lj_baseURL = "https://www.baidu.com"


enum LJApiManager {

????case Login([String: Any])

????case otherURL

}

extension LJApiManager: TargetType {

var baseURL: URL {

switch self {

case .Login:

return URL(string: lj_baseURL)!

default:

return URL(string: lj_baseURL)!

}

}

var path: String {

switch self {

case .Login:

return "login"

default:

return ""

}

}

var method: Moya.Method {

switch self {

case .Login:

return .post

default:

return .post

}

}

var sampleData: Data {

switch self {

case .Login:

return "".data(using: .utf8)!

default:

return "".data(using: .utf8)!

}

}

var task: Task {

switch self {

case .Login(let parameters):

return .requestParameters(parameters: parameters, encoding: URLEncoding.default)

default:

return .requestPlain

}

}

var headers: [String : String]? {

return nil

}

}

可選:Moya的插件PluginType

public final class LJRequestPlugin: PluginType {?

// 請(qǐng)求開始

?public func willSend(_ request: RequestType, target: TargetType) { ? ? ? ? ? ? ? ? ? ? ? ? ? UIApplication.shared.isNetworkActivityIndicatorVisible = true

}

// 請(qǐng)求結(jié)束

?public func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {

UIApplication.shared.isNetworkActivityIndicatorVisible = false

}

}

解析數(shù)據(jù)給Observable寫個(gè)擴(kuò)展

extension Observable {

?func mapObject<T: BaseMappable>(type: T.Type) -> Observable<T>{?

?return self.map({ response in?

?guard let dict = response as? [String: Any], let object = Mapper().map(JSON: dict) else { throw LJNetError.JSONError

?}?

?return object

?})

?}

?func mapArray<T: BaseMappable>(type: T.Type) -> Observable<[T]> {?

?return self.map { response in?

?let json = JSON(response)?

?guard let array = json["body"].arrayObject as? [[String: Any]] else {?

?throw LJNetError.JSONError?

?}

?return Mapper().mapArray(JSONArray: array)

}

}

}

enum LJNetError: String {

case JSONError = "JSON解析錯(cuò)誤"

case OtherError = "其他錯(cuò)誤"

}

extension LJNetError: Swift.Error {}


定義一個(gè)全局的MoyaProvider

let provider = MoyaProvider<LJApiManager>(plugins: [LJRequestPlugin()])


寫個(gè)基本請(qǐng)求類 (UserModel是一個(gè)用戶模型)

import Moya

import RxSwift

import ObjectMapper

final class LJBaseModel {?

?init() {

?}?

?static var share: LJBaseModel {

?struct Static {?

?static let instance: LJBaseModel = LJBaseModel()?

?}

?return Static.instance

?}

?func login(_ paras: [String: Any]) -> Observable<UserModel>{

return rx_provider.rx.request(.Login(paras)).filterSuccessfulStatusCodes().asObservable().mapJSON().mapObject(type: UserModel.self)

}

}


使用

LJBaseModel.share.login(["username": "admin", "password": "123456"]).subscribe(onNext: { userModel in

print(userModel.result.name)

}).disposed(by: disposeBag)

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 4,118評(píng)論 0 6
  • 1、隨機(jī)數(shù) 不需要隨機(jī)數(shù)種子 arc4random()%N + begin:產(chǎn)生begin~begin+N的隨機(jī)數(shù)...
    我是小胡胡123閱讀 4,409評(píng)論 0 2
  • 2014年的蘋果全球開發(fā)者大會(huì)(WWDC),當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,407評(píng)論 0 9
  • Swift 介紹 簡(jiǎn)介 Swift 語言由蘋果公司在 2014 年推出,用來撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,446評(píng)論 3 25

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