Skip to content

Commit 1a76c7d

Browse files
author
Adam Debono
committed
added NetworkObjectRequest which extracts object mapping functionality from NetworkRequest
1 parent 43488a6 commit 1a76c7d

File tree

3 files changed

+74
-43
lines changed

3 files changed

+74
-43
lines changed

NetworkMapper.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "NetworkMapper"
3-
s.version = "0.0.1"
3+
s.version = "0.0.2"
44
s.summary = "Map JSON responses to Swift Objects"
55
s.homepage = "https://github.com/adamdebono/NetworkMapper"
66
s.license = { :type => "MIT", :file => "LICENSE" }

Source/NetworkObjectRequest.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
import Alamofire
3+
import Foundation
4+
import Unbox
5+
6+
public protocol NetworkObjectRequest: NetworkRequest {
7+
associatedtype ResponseType: Unboxable
8+
9+
func responseDecoded(_ response: ResponseType)
10+
}
11+
12+
public extension NetworkObjectRequest {
13+
@discardableResult
14+
public func responseObject(completionHandler: @escaping ((DataResponse<ResponseType>) -> Void)) -> DataRequest {
15+
return self.responseJSON { response in
16+
self.processObjectResponse(response: response, completionHandler: completionHandler)
17+
}
18+
}
19+
public func processObjectResponse(response: DataResponse<Any>, completionHandler: @escaping ((DataResponse<ResponseType>) -> Void)) {
20+
switch response.result {
21+
case .failure(let error):
22+
self.complete(error: error, response: response, completionHandler: completionHandler)
23+
case .success(let value):
24+
guard let value = value as? [String: Any] else {
25+
let error = ResponseError.invalidResponse
26+
self.complete(error: error, response: response, completionHandler: completionHandler)
27+
return
28+
}
29+
30+
do {
31+
let object: ResponseType = try unbox(dictionary: value)
32+
self.responseDecoded(object)
33+
self.complete(object: object, response: response, completionHandler: completionHandler)
34+
} catch let unboxError as UnboxError {
35+
self.complete(error: unboxError, response: response, completionHandler: completionHandler)
36+
} catch {
37+
let error = ResponseError.invalidResponse
38+
self.complete(error: error, response: response, completionHandler: completionHandler)
39+
}
40+
}
41+
}
42+
}

Source/NetworkRequest.swift

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11

22
import Alamofire
33
import Foundation
4-
import Unbox
54

6-
public struct RequestDetails {
5+
public struct RequestDetails: URLRequestConvertible {
76
public let method: HTTPMethod
87
public let url: URL
98
public let parameters: [String: Any]?
@@ -13,18 +12,20 @@ public struct RequestDetails {
1312
self.url = url
1413
self.parameters = parameters
1514
}
15+
16+
public func asURLRequest() throws -> URLRequest {
17+
var request = URLRequest(url: self.url)
18+
request.httpMethod = self.method.rawValue
19+
20+
return try URLEncoding.methodDependent.encode(request, with: self.parameters)
21+
}
1622
}
1723

1824
public protocol NetworkRequest: URLRequestConvertible {
19-
associatedtype ResponseType: Unboxable
20-
2125
var method: HTTPMethod { get }
2226
var url: URL { get }
2327
var parameters: [String: Any]? { get }
24-
25-
func responseDecoded(_ response: ResponseType)
2628
}
27-
2829
public extension NetworkRequest {
2930
public func getRequestDetails() -> RequestDetails {
3031
return RequestDetails(
@@ -35,11 +36,7 @@ public extension NetworkRequest {
3536
}
3637

3738
public func asURLRequest() throws -> URLRequest {
38-
let requestDetails = self.getRequestDetails()
39-
var request = URLRequest(url: requestDetails.url)
40-
request.httpMethod = requestDetails.method.rawValue
41-
42-
return try URLEncoding.methodDependent.encode(request, with: requestDetails.parameters)
39+
return try self.getRequestDetails().asURLRequest()
4340
}
4441

4542
public func complete<R, T>(error: Error, response: DataResponse<R>?, completionHandler: (DataResponse<T>) -> Void) {
@@ -53,6 +50,28 @@ public extension NetworkRequest {
5350
completionHandler(successResponse)
5451
}
5552

53+
// MARK: Data
54+
55+
@discardableResult
56+
public func responseData(completionHandler: @escaping ((DataResponse<Data>) -> Void)) -> DataRequest {
57+
return Alamofire.request(self).responseData(completionHandler: { response in
58+
switch response.result {
59+
case .failure(let error):
60+
if let error = error as? URLError {
61+
if error.code == URLError.cancelled {
62+
return
63+
}
64+
}
65+
default:
66+
break
67+
}
68+
69+
completionHandler(response)
70+
})
71+
}
72+
73+
// MARK: JSON
74+
5675
@discardableResult
5776
public func responseJSON(completionHandler: @escaping ((DataResponse<Any>) -> Void)) -> DataRequest {
5877
return Alamofire.request(self).responseJSON { response in
@@ -74,34 +93,4 @@ public extension NetworkRequest {
7493

7594
completionHandler(response)
7695
}
77-
78-
@discardableResult
79-
public func responseObject(completionHandler: @escaping ((DataResponse<ResponseType>) -> Void)) -> DataRequest {
80-
return self.responseJSON { response in
81-
self.processObjectResponse(response: response, completionHandler: completionHandler)
82-
}
83-
}
84-
public func processObjectResponse(response: DataResponse<Any>, completionHandler: @escaping ((DataResponse<ResponseType>) -> Void)) {
85-
switch response.result {
86-
case .failure(let error):
87-
self.complete(error: error, response: response, completionHandler: completionHandler)
88-
case .success(let value):
89-
guard let value = value as? [String: Any] else {
90-
let error = ResponseError.invalidResponse
91-
self.complete(error: error, response: response, completionHandler: completionHandler)
92-
return
93-
}
94-
95-
do {
96-
let object: ResponseType = try unbox(dictionary: value)
97-
self.responseDecoded(object)
98-
self.complete(object: object, response: response, completionHandler: completionHandler)
99-
} catch let unboxError as UnboxError {
100-
self.complete(error: unboxError, response: response, completionHandler: completionHandler)
101-
} catch {
102-
let error = ResponseError.invalidResponse
103-
self.complete(error: error, response: response, completionHandler: completionHandler)
104-
}
105-
}
106-
}
10796
}

0 commit comments

Comments
 (0)