美文网首页
Moya+RxSwift实现简单个网络请求框架

Moya+RxSwift实现简单个网络请求框架

作者: Unique_c | 来源:发表于2017-11-13 15:18 被阅读24次

    代码简单   (解析数据使用ObjectMapper+SwiftyJSON)

    首先写个遵循自Moya的TargetType协议的枚举

    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 { 

    // 请求开始

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

    }

    // 请求结束

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

    UIApplication.shared.isNetworkActivityIndicatorVisible = false

    }

    }

    解析数据给Observable写个扩展

    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解析错误"

    case OtherError = "其他错误"

    }

    extension LJNetError: Swift.Error {}

    定义一个全局的MoyaProvider

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

    写个基本请求类 (UserModel是一个用户模型)

    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)

    相关文章

      网友评论

          本文标题:Moya+RxSwift实现简单个网络请求框架

          本文链接:https://www.haomeiwen.com/subject/qwjzmxtx.html