Guest User

Untitled

a guest
Feb 18th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.51 KB | None | 0 0
  1. //
  2. // NetworkService.swift
  3. // PKBPartyKit
  4. //
  5. // Created by alfian0 on 2/6/18.
  6. // Copyright © 2018 Extra Integer. All rights reserved.
  7. //
  8.  
  9. import ObjectMapper
  10. import Moya
  11. import RxSwift
  12.  
  13. enum BaseResponse {
  14. case success(data: Mappable?)
  15. case error(error: ErrorResponse?)
  16. }
  17.  
  18. struct NetworkService: INetworkService {
  19.  
  20. static let instance = NetworkService()
  21. fileprivate let disposeBag = DisposeBag()
  22. fileprivate let provider: MoyaProvider<NetworkAPI>
  23.  
  24. private init() {
  25. self.provider = MoyaProvider<NetworkAPI>(
  26. plugins: [
  27. RequestLoadingPlugin()
  28. ]
  29. )
  30. }
  31. }
  32.  
  33. extension NetworkService {
  34.  
  35. internal func requestObject(_ token: NetworkAPI, mappableClass: Mappable.Type? = nil) -> Observable<BaseResponse?> {
  36.  
  37. return Observable.create({ (observer) -> Disposable in
  38. return self.provider.rx.request(token)
  39. .filterSuccessfulStatusCodes()
  40. .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
  41. .subscribe { event in
  42. switch event {
  43. case .success(let response):
  44.  
  45. // Check mappableClass is not nil
  46. // mappableClass is model
  47. guard let mappableClass = mappableClass else {
  48. observer.onNext(nil)
  49. observer.onCompleted()
  50. return
  51. }
  52.  
  53. do {
  54. // First we need map response to JSON
  55. // Parse json to get success status
  56. // If we are not getting success status throw NetworkError.IncorrectDataReturned
  57. guard let jsonResponse = try response.mapJSON() as? [String: Any] else {
  58. observer.onError(NetworkError.IncorrectDataReturned)
  59. return
  60. }
  61.  
  62. // Map jsonData to ObjectMapper format
  63. let map = Map(mappingType: .fromJSON, JSON: jsonResponse)
  64.  
  65. if let statusCode = response.response?.statusCode, (statusCode >= 200 && statusCode < 300) {
  66. guard let modelObject = mappableClass.init(map: map) else {
  67. observer.onError(NetworkError.IncorrectDataReturned)
  68. return
  69. }
  70. observer.onNext(.success(data: modelObject))
  71. observer.onCompleted()
  72. } else {
  73. guard let errorResponse = ErrorResponse.init(map: map) else {
  74. observer.onError(NetworkError.IncorrectDataReturned)
  75. return
  76. }
  77. observer.onNext(.error(error: errorResponse))
  78. observer.onCompleted()
  79. }
  80. } catch {
  81. observer.onError(NetworkError.IncorrectDataReturned)
  82. }
  83. break
  84. case .error(let error):
  85. if let error = error as? MoyaError {
  86. do {
  87. guard let json = try error.response?.mapJSON() as? [String: Any] else {
  88. observer.onError(NetworkError.IncorrectDataReturned)
  89. return
  90. }
  91. let map = Map(mappingType: .fromJSON, JSON: json)
  92. guard let errorResponse = ErrorResponse.init(map: map) else {
  93. observer.onError(NetworkError.IncorrectDataReturned)
  94. return
  95. }
  96. observer.onNext(.error(error: errorResponse))
  97. } catch {
  98. observer.onError(NetworkError(error: error as NSError))
  99. }
  100. } else {
  101. observer.onError(NetworkError(error: error as NSError))
  102. }
  103. }
  104. }
  105. })
  106. }
  107. }
Add Comment
Please, Sign In to add comment