Anviking / Decodable

[Probably deprecated] Swift 2/3 JSON unmarshalling done (more) right
MIT License
1.04k stars 73 forks source link

How about implement Moya-Decodable ? #140

Open Arcovv opened 7 years ago

Arcovv commented 7 years ago

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)
Arcovv commented 7 years ago

I forgot to add rootKey: String = nil for every methods...