diff --git a/CHANGELOG.md b/CHANGELOG.md index f1ef7ba9..abfac830 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### 0.9.8 +- **Add**: `rxDataRequest` method to `NetworkService` class, that performs reactive request to get data and http response. +- **Add**: `responseData` method to `SessionManager` extension, that executes request and returns data. + ### 0.9.7 - **Add**: Carthage support. diff --git a/LeadKit.podspec b/LeadKit.podspec index 7c78c28a..ed665e75 100644 --- a/LeadKit.podspec +++ b/LeadKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKit" - s.version = "0.9.7" + s.version = "0.9.8" s.summary = "iOS framework with a bunch of tools for rapid development" s.homepage = "https://github.com/TouchInstinct/LeadKit" s.license = "Apache License, Version 2.0" diff --git a/Sources/Classes/Services/NetworkService.swift b/Sources/Classes/Services/NetworkService.swift index d8e80348..5b8f5beb 100644 --- a/Sources/Classes/Services/NetworkService.swift +++ b/Sources/Classes/Services/NetworkService.swift @@ -79,6 +79,17 @@ open class NetworkService { decoder: decoder) .counterTracking(for: self) } + + /// Perform reactive request to get data and http response + /// + /// - Parameter parameters: api parameters to pass Alamofire + /// - Returns: Observable of tuple containing (HTTPURLResponse, Data) + public func rxDataRequest(with parameters: ApiRequestParameters) + -> Observable<(response: HTTPURLResponse, data: Data)> { + + return sessionManager.rx.responseData(requestParameters: parameters) + .counterTracking(for: self) + } } private extension NetworkService { diff --git a/Sources/Extensions/Alamofire/SessionManager+Extensions.swift b/Sources/Extensions/Alamofire/SessionManager+Extensions.swift index c91bfad7..8cae1352 100644 --- a/Sources/Extensions/Alamofire/SessionManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/SessionManager+Extensions.swift @@ -105,6 +105,7 @@ public extension Reactive where Base: SessionManager { return requestObservable .map { $0.validate(statusCode: self.base.acceptableStatusCodes) } + .catchAsRequestError() } /// Method that executes request and serializes response into target object @@ -121,7 +122,6 @@ public extension Reactive where Base: SessionManager { $0.rx.apiResponse(mappingQueue: self.base.mappingQueue, decoder: decoder) .catchAsRequestError(with: $0) } - .catchAsRequestError() } /// Method that executes request and serializes response into target object @@ -138,7 +138,22 @@ public extension Reactive where Base: SessionManager { $0.rx.observableApiResponse(mappingQueue: self.base.mappingQueue, decoder: decoder) .catchAsRequestError(with: $0) } - .catchAsRequestError() + } + + /// Method that executes request and returns data + /// + /// - Parameter requestParameters: api parameters to pass Alamofire + /// - Returns: Observable with HTTP URL Response and Data + func responseData(requestParameters: ApiRequestParameters) + -> Observable<(response: HTTPURLResponse, data: Data)> { + + return apiRequest(requestParameters: requestParameters) + .flatMap { + $0.rx.responseResult(queue: self.base.mappingQueue, + responseSerializer: DataRequest.dataResponseSerializer()) + .map { ($0, $1 as Data) } + .catchAsRequestError(with: $0) + } } }