Skip to content

How about implement Moya-Decodable ? #140

@Arcovv

Description

@Arcovv

Recently, I try to use RxSwift + Moya + Decodable to do my project. But I can't find a better Decodable extension for supporting Moya.

So I try to inplement it by myself.

Perhaps it should be written in other better ways, such as naming can have a better way. I'm not sure:

import Foundation
import Moya
import RxSwift
import Decodable

extension ObservableType where E == Response {
  
  public func mapObject<T: Decodable>(type: T.Type) -> Observable<T> {
    return flatMap { response -> Observable<T> in
      return Observable.just(try response.mapObject())
    }
  }
  
  public func mapObjectArray<T: Decodable>(type: T.Type) -> Observable<[T]> {
    return flatMap { response -> Observable<[T]> in
      return Observable.just(try response.mapObjectArray())
    }
  }
  
}

extension Moya.Response {

  public func mapObject<T: Decodable>() throws -> T {
    return try T.decode(try mapJSON())
  }
  
  public func mapObjectArray<T: Decodable>() throws -> [T] {
    return try [T].decode(try mapJSON())
  }
  
}

So it can use like this:

let provider = RxMoyaProvider<Api>()
provider.request(.requestSomething)
  .mapObject(type: DecodableObject.self)
  .subscribe { event in
    switch event {
    case .next(let element):
      print("next: \(element)")
    case .error(let error):
      print("error: \(error)")
    case .completed:
      print("completed")
    }
  }
  .addDisposableTo(disposeBag)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions