From 310bec29d1fa75f184525697e64a4eb6e0556d2c Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 5 Dec 2017 16:04:30 +0300 Subject: [PATCH 1/2] Ability to map primitive response types (`String`, `Int`, `[String]`, etc.). --- CHANGELOG.md | 4 +++ LeadKit.podspec | 2 +- .../AlamofireManager+Extensions.swift | 22 ++++++++++--- .../AlamofireRequest+Extensions.swift | 31 ++++++++++++++----- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcba36fc..78ee81b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### 0.6.6 + +- **Add**: Ability to map primitive response types (`String`, `Int`, `[String]`, etc.). + ### 0.6.5 - **Add**: Ability to handle responses with non-default status codes. diff --git a/LeadKit.podspec b/LeadKit.podspec index 8db51ad6..0b5caf6b 100644 --- a/LeadKit.podspec +++ b/LeadKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKit" - s.version = "0.6.5" + s.version = "0.6.6" 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/Extensions/Alamofire/AlamofireManager+Extensions.swift b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift index 9c010ba0..0a85f490 100644 --- a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -50,7 +50,7 @@ public extension Reactive where Base: Alamofire.SessionManager { .map { $0.validate(statusCode: acceptableStatusCodes) } } - /// Method which executes request and serializes response into target object + /// Method that executes request and serializes response into target object /// /// - Parameter requestParameters: api parameters to pass Alamofire /// - Parameter mappingQueue: The dispatch queue to use for mapping @@ -64,7 +64,7 @@ public extension Reactive where Base: Alamofire.SessionManager { .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } - /// Method which executes request and serializes response into array of target objects + /// Method that executes request and serializes response into array of target objects /// /// - Parameter requestParameters: api parameters to pass Alamofire /// - Parameter mappingQueue: The dispatch queue to use for mapping @@ -78,7 +78,21 @@ public extension Reactive where Base: Alamofire.SessionManager { .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } - /// Method which executes request and serializes response into target object + /// Method that executes request and serializes response into target type + /// + /// - Parameter requestParameters: api parameters to pass Alamofire + /// - Parameter mappingQueue: The dispatch queue to use for mapping + /// - Returns: Observable with HTTP URL Response and target object + func responseObject(requestParameters: ApiRequestParameters, + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) + -> Observable<(response: HTTPURLResponse, object: T)> { + + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } + } + + /// Method that executes request and serializes response into target object /// /// - Parameter requestParameters: api parameters to pass Alamofire /// - Parameter mappingQueue: The dispatch queue to use for mapping @@ -92,7 +106,7 @@ public extension Reactive where Base: Alamofire.SessionManager { .flatMap { $0.rx.observableApiResponse(mappingQueue: mappingQueue) } } - /// Method which executes request and serializes response into array of target objects + /// Method that executes request and serializes response into array of target objects /// /// - Parameter requestParameters: api parameters to pass Alamofire /// - Parameter mappingQueue: The dispatch queue to use for mapping diff --git a/Sources/Extensions/Alamofire/AlamofireRequest+Extensions.swift b/Sources/Extensions/Alamofire/AlamofireRequest+Extensions.swift index 441b5918..7070be0a 100644 --- a/Sources/Extensions/Alamofire/AlamofireRequest+Extensions.swift +++ b/Sources/Extensions/Alamofire/AlamofireRequest+Extensions.swift @@ -29,7 +29,9 @@ typealias ServerResponse = (response: HTTPURLResponse, result: Any) public extension Reactive where Base: DataRequest { - /// Method which serializes response into target object + private typealias JSON = [String: Any] + + /// Method that serializes response into target object /// /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object @@ -38,13 +40,13 @@ public extension Reactive where Base: DataRequest { return responseJSONOnQueue(mappingQueue) .tryMapResult { resp, value in - let json = try cast(value) as [String: Any] + let json = try cast(value) as JSON return (resp, try T(JSON: json)) } } - /// Method which serializes response into array of target objects + /// Method that serializes response into array of target objects /// /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and array of target objects @@ -53,13 +55,26 @@ public extension Reactive where Base: DataRequest { return responseJSONOnQueue(mappingQueue) .tryMapResult { resp, value in - let jsonArray = try cast(value) as [[String: Any]] + let jsonArray = try cast(value) as [JSON] return (resp, try Mapper().mapArray(JSONArray: jsonArray)) } } - /// Method which serializes response into target object + /// Method that serializes response into target type + /// + /// - Parameter mappingQueue: The dispatch queue to use for mapping + /// - Returns: Observable with HTTP URL Response and target object + func apiResponse(mappingQueue: DispatchQueue = .global()) + -> Observable<(response: HTTPURLResponse, object: T)> { + + return responseJSONOnQueue(mappingQueue) + .tryMapResult { resp, value in + return (resp, try cast(value) as T) + } + } + + /// Method that serializes response into target object /// /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object @@ -68,14 +83,14 @@ public extension Reactive where Base: DataRequest { return responseJSONOnQueue(mappingQueue) .tryMapObservableResult { resp, value in - let json = try cast(value) as [String: Any] + let json = try cast(value) as JSON return T.createFrom(map: Map(mappingType: .fromJSON, JSON: json)) .map { (resp, $0) } } } - /// Method which serializes response into array of target objects + /// Method that serializes response into array of target objects /// /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and array of target objects @@ -84,7 +99,7 @@ public extension Reactive where Base: DataRequest { return responseJSONOnQueue(mappingQueue) .tryMapObservableResult { resp, value in - let jsonArray = try cast(value) as [[String: Any]] + let jsonArray = try cast(value) as [JSON] let createFromList = jsonArray.map { T.createFrom(map: Map(mappingType: .fromJSON, JSON: $0)) From 3e75237ec3580c967975de40189950efee2f0faa Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Tue, 5 Dec 2017 16:15:25 +0300 Subject: [PATCH 2/2] align --- .../Extensions/Alamofire/AlamofireManager+Extensions.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift index 0a85f490..b6fd875e 100644 --- a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -84,8 +84,8 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object func responseObject(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global(), - acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, object: T)> { return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes)