diff --git a/LeadKit.podspec b/LeadKit.podspec index 17500250..8ae4bfab 100644 --- a/LeadKit.podspec +++ b/LeadKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKit" - s.version = "0.4.2" + s.version = "0.4.3" 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/LeadKit/.DS_Store b/LeadKit/.DS_Store deleted file mode 100644 index 23116d74..00000000 Binary files a/LeadKit/.DS_Store and /dev/null differ diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift index a0a50cbd..e41c258e 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -52,6 +52,19 @@ public extension Reactive where Base: Alamofire.SessionManager { .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } } + /// Method which 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 + /// - Returns: Observable with HTTP URL Response and array of target objects + func responseModel(requestParameters: ApiRequestParameters, + mappingQueue: DispatchQueue = DispatchQueue.global()) + -> Observable<(response: HTTPURLResponse, models: [T])> { + + return apiRequest(requestParameters: requestParameters) + .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } + } + /// Method which executes request and serializes response into target object /// /// - Parameter requestParameters: api parameters to pass Alamofire @@ -65,4 +78,17 @@ public extension Reactive where Base: Alamofire.SessionManager { .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } } + /// Method which 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 + /// - Returns: Observable with HTTP URL Response and array of target objects + func responseObservableModel(requestParameters: ApiRequestParameters, + mappingQueue: DispatchQueue = DispatchQueue.global()) + -> Observable<(response: HTTPURLResponse, models: [T])> where T.ModelType == T { + + return apiRequest(requestParameters: requestParameters) + .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } + } + } diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift index 7fa659f3..e0e5a2f0 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift @@ -42,6 +42,21 @@ public extension Reactive where Base: DataRequest { } } + /// Method which 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 + func apiResponse(mappingQueue: DispatchQueue = DispatchQueue.global()) + -> Observable<(response: HTTPURLResponse, models: [T])> { + + return responseJSONOnQueue(mappingQueue) + .map { resp, value in + let jsonArray = try cast(value) as [[String: Any]] + + return (resp, try Mapper().mapArray(JSONArray: jsonArray)) + } + } + /// Method which serializes response into target object /// /// - Parameter mappingQueue: The dispatch queue to use for mapping @@ -58,6 +73,26 @@ public extension Reactive where Base: DataRequest { } } + /// Method which 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 + func apiResponse(mappingQueue: DispatchQueue = DispatchQueue.global()) + -> Observable<(response: HTTPURLResponse, models: [T])> where T.ModelType == T { + + return responseJSONOnQueue(mappingQueue) + .flatMap { resp, value -> Observable<(response: HTTPURLResponse, models: [T])> in + let jsonArray = try cast(value) as [[String: Any]] + + let createFromList = jsonArray.map { + T.createFrom(map: Map(mappingType: .fromJSON, JSON: $0)) + } + + return Observable.zip(createFromList) { $0 } + .map { (resp, $0) } + } + } + internal func responseJSONOnQueue(_ queue: DispatchQueue) -> Observable<(HTTPURLResponse, Any)> { return responseResult(queue: queue, responseSerializer: DataRequest.jsonResponseSerializer(options: .allowFragments)) }