Skip to content

Commit 42e581d

Browse files
author
burak.uzunboy
committed
Executor is moved inside of the APIConfiguration object.
1 parent 2902f8a commit 42e581d

4 files changed

Lines changed: 69 additions & 28 deletions

File tree

Sources/iOSUsefulNetworkLayer/NetworkLayer/APIConfiguration.swift

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,34 +26,34 @@ import iOSCoreUsefulSDK
2626
/// Structure that keeps all information needed from Network Layer for operations.
2727
public struct APIConfiguration<T> where T: ResponseBodyParsable {
2828
/// Returns `URL` of the API request.
29-
var requestURL: URL
29+
public var requestURL: URL
3030

3131
/// Type of the API request.
32-
var requestType: NetworkLayer.RequestType
32+
public var requestType: NetworkLayer.RequestType
3333

3434
/// Headers for the API request.
35-
var headers: [String:String]?
35+
public var headers: [String:String]?
3636

3737
/// Request body for the API request.
38-
var body: [String:Any]?
38+
public var body: [String:Any]?
3939

4040
/// The expected object type from the request.
41-
var responseBodyObject: T.Type
41+
public var responseBodyObject: T.Type
4242

4343
/// `NetworkLayer` priorities the API request by looking that parameter.
44-
var priority: Operation.QueuePriority
44+
public var priority: Operation.QueuePriority
4545

4646
/// The desired expiration time for the API request.
47-
var cachingTime: NetworkLayer.CachingTime
47+
public var cachingTime: NetworkLayer.CachingTime
4848

4949
/// `NetworkLayer` adds desired queue by looking that parameter.
50-
var isMainOperation: Bool
50+
public var isMainOperation: Bool
5151

5252
/// If `true`, the response will be cached by specified `cachingEndsAt` parameter of the response object.
53-
var autoCache: Bool
53+
public var autoCache: Bool
5454

5555
/// The timeout value for the request wait time.
56-
var timeOut: Int
56+
public var timeOut: Int
5757

5858
/**
5959
Initializes Configuration with the host URL and endpoint separately.
@@ -155,6 +155,13 @@ public struct APIConfiguration<T> where T: ResponseBodyParsable {
155155
return operation
156156
}
157157

158+
/// Requests given API configuration by using `NetworkLayer`.
159+
/// - Parameter completion: Completion block which contains error or success case.
160+
/// - Parameter response: Response `Enum` which has two cases, whether `error` or `success`.
161+
public func request(completion: @escaping (_ response: NetworkLayer.Result<T>)->()) {
162+
NetworkLayer.execute(self, completion: completion)
163+
}
164+
158165
}
159166

160167
/**
@@ -203,3 +210,36 @@ open class ResponseBodyParsable: NSObject, NSDiscardableContent {
203210
return nil
204211
}
205212
}
213+
214+
215+
/// Response of the API if request is completed successfully.
216+
public struct APIResponse<T> where T: ResponseBodyParsable {
217+
218+
/// Response body of the API request.
219+
public private(set) var responseBody: T
220+
221+
/// Main URL response of the API request.
222+
public private(set) var response: URLResponse
223+
224+
internal init(response: URLResponse, responseBody: T) {
225+
self.response = response
226+
self.responseBody = responseBody
227+
}
228+
229+
}
230+
231+
/// Error result if the API request fails.
232+
public struct APIError<T> where T: ResponseBodyParsable {
233+
234+
/// Error reason that explains why API request is failed.
235+
public private(set) var error: NSError
236+
237+
/// The API request that fails.
238+
public private(set) var api: APIConfiguration<T>
239+
240+
internal init(request: APIConfiguration<T>, error: NSError) {
241+
self.api = request
242+
self.error = error
243+
}
244+
245+
}

Sources/iOSUsefulNetworkLayer/NetworkLayer/NetworkLayer+Cache.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import Foundation
2525
import UIKit
2626
#endif
2727

28-
extension NetworkLayer {
28+
public extension NetworkLayer {
2929

3030
/// Custom Caching class.
31-
public class Cache: URLCache {
31+
class Cache: URLCache {
3232

3333
/// Default initializer.
3434
override init() {

Sources/iOSUsefulNetworkLayer/NetworkLayer/NetworkLayer.swift

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
3535
*/
3636
public enum Result<T> where T: ResponseBodyParsable {
3737
/// Returns response.
38-
case success(T)
38+
case success(APIResponse<T>)
3939
/// Returns reason of the error.
40-
case error(NSError)
40+
case error(APIError<T>)
4141
}
42+
4243

4344
// MARK: - Properties
4445

@@ -103,7 +104,7 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
103104
NotificationCenter.default.removeObserver(self)
104105
}
105106

106-
// MARK: Public Methods
107+
// MARK: Internal Methods
107108

108109
/**
109110
Executes configured API.
@@ -112,14 +113,14 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
112113
- parameter error: Returns reason of the error if operation fails. `nil` otherwise
113114
- parameter response: Returns response with the specified type of response
114115
*/
115-
public class func execute<T>(_ request: APIConfiguration<T>, completion: @escaping (Result<T>)->()) where T:ResponseBodyParsable {
116+
internal class func execute<T>(_ request: APIConfiguration<T>, completion: @escaping (Result<T>)->()) where T:ResponseBodyParsable {
116117
let instance = NetworkLayer.shared
117118
DispatchQueue.global().async {
118119
guard let urlRequest = request.request else {
119120
let err = NSError(domain: "", code: 500, description: "Cannot create URL Request with specified configurations")
120121
instance.sendLog(message: err.localizedDescription, logType: .error(code: 900, name: err.localizedDescription))
121122
DispatchQueue.main.async {
122-
completion(.error(err))
123+
completion(.error(APIError(request: request, error: err)))
123124
}
124125
return
125126
}
@@ -144,7 +145,7 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
144145
} else {
145146
instance.sendLog(message: "Operation:\(operation.identifier) failed with error: \(error.localizedDescription)", logType: .error(code: (error as NSError).code, name: error.localizedDescription))
146147
DispatchQueue.main.async {
147-
completion(.error(error as NSError))
148+
completion(.error(.init(request: request, error: error as NSError)))
148149
}
149150
return
150151
}
@@ -155,7 +156,7 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
155156
guard let data = dataResult, let loadResponse = loadedResponse else {
156157
let err = NSError(domain: "", code: 500, description: "Data is empty - Operation: \(operation.identifier)")
157158
DispatchQueue.main.async {
158-
completion(.error(err))
159+
completion(.error(.init(request: request, error: err)))
159160
}
160161
return
161162
}
@@ -189,6 +190,8 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
189190
}
190191
}
191192

193+
// MARK: Private Methods
194+
192195
/// Proceeds the response and completes.
193196
private func proceedResponse<T>(response: URLResponse, data: Data,
194197
operationId: Int,
@@ -201,7 +204,7 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
201204
self._cache?.changeCacheExpiry(for: request.request!, to: cacheTiming)
202205
}
203206
DispatchQueue.main.async {
204-
completion(.success(dataObject))
207+
completion(.success(APIResponse(response: response, responseBody: dataObject)))
205208
}
206209
return
207210
}
@@ -214,26 +217,24 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
214217
self._cache?.changeCacheExpiry(for: request.request!, to: cacheTiming)
215218
}
216219
DispatchQueue.main.async {
217-
completion(.success(responseObject))
220+
completion(.success(APIResponse(response: response, responseBody: responseObject)))
218221
}
219222
} else {
220223
DispatchQueue.main.async {
221224
let err = NSError(domain: "", code: 500, description: "Cannot create response body - Operation: \(operationId)")
222-
completion(.error(err))
225+
completion(.error(.init(request: request, error: err)))
223226
}
224227
}
225228
} catch {
226229
self.sendLog(message: "Couldn't create JSON Data from Operation: \(operationId) - Error: \(error.localizedDescription)",
227230
logType: .error(code: 900, name: error.localizedDescription))
228231
DispatchQueue.main.async {
229232
let err = NSError(domain: "", code: 500, description: error.localizedDescription)
230-
completion(.error(err))
233+
completion(.error(.init(request: request, error: err)))
231234
}
232235
}
233236
}
234-
235-
// MARK: Private Methods
236-
237+
237238
/**
238239
Sends logs to listener. Shouldn't be called outside of the `NetworkLayer`.
239240
- parameter message: Log message

Tests/iOSUsefulNetworkLayerTests/iOSUsefulNetworkLayerTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ final class iOSUsefulNetworkLayerTests: XCTestCase {
2626
return
2727
}
2828

29-
NetworkLayer.execute(apiReq) { (result) in
29+
apiReq.request { (result) in
3030
switch result {
3131
case .error(let err):
32-
XCTFail("Error: \(err.localizedDescription)")
32+
XCTFail("Error: \(err.error.localizedDescription)")
3333
break
3434
case .success(_):
3535
exp.fulfill()

0 commit comments

Comments
 (0)