Skip to content

Commit f398484

Browse files
Merge pull request #21 from AppcentMobile/feature/download-support
Feature/download support
2 parents 3537b49 + 2957996 commit f398484

15 files changed

+351
-131
lines changed

Sources/ACMNetworking/ACMNetworking.swift

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,57 +6,54 @@ import Foundation
66

77
/// ACMNetworking, make requests easily
88
public class ACMNetworking: NSObject {
9-
private var task: URLSessionDataTask?
9+
var mainEndpoint: ACMBaseEndpoint?
10+
var session: URLSession?
11+
var requestTask: URLSessionDataTask?
12+
var downloadTask: URLSessionDownloadTask?
13+
var taskProgress: NSKeyValueObservation?
14+
15+
/// Predefined variables
16+
var logger: ACMBaseLogger? {
17+
mainEndpoint?.logger
18+
}
19+
20+
var stringUtils: ACMStringUtils? {
21+
mainEndpoint?.stringUtils
22+
}
1023

1124
/// Public Init function
1225
/// For creating object with SDK
1326
override public init() {
1427
super.init()
1528
}
1629

17-
/// Main request function
18-
///
19-
/// - Parameters:
20-
/// - endpoint: base endpoint that keeps all endpoint information
21-
/// - currentRetryCount(Optional): retry request count
22-
/// - onSuccess: Callback for success scenario
23-
/// - onError: Callback for error scenario
24-
///
25-
/// - Returns:
26-
/// - Void
27-
public func request<T: Decodable>(to endpoint: ACMBaseEndpoint,
28-
currentRetryCount: Int? = 0,
29-
onSuccess: ACMGenericCallbacks.ResponseCallback<T>,
30-
onError: ACMGenericCallbacks.ErrorCallback)
31-
{
32-
guard let urlRequest = generateURLRequest(endpoint: endpoint) else { return }
33-
34-
task = endpoint.session(delegate: self).dataTask(with: urlRequest) { [weak self] data, response, error in
35-
guard let self else { return }
36-
37-
self.handleNilErrorResponse(with: endpoint, error: error, onError: onError)
38-
self.handleNilResponse(with: endpoint, response: response, onError: onError)
39-
self.handleConnectivityError(with: endpoint, error: error, onError: onError)
40-
41-
guard let data = self.handleData(with: endpoint, data: data, onError: onError) else { return }
42-
guard let httpResponse = self.handleHttpResponse(with: endpoint, response: response, onError: onError) else { return }
43-
44-
// Check if response is in valid http range
45-
guard self.validateResponse(with: httpResponse) else {
46-
self.executeRetry(with: endpoint, httpResponse: httpResponse, data: data, currentRetryCount: currentRetryCount, onSuccess: onSuccess, onError: onError)
47-
return
48-
}
49-
50-
self.cancel()
51-
52-
self.handleResult(with: endpoint, data: data, onSuccess: onSuccess, onError: onError)
53-
}
54-
task?.resume()
30+
/// Public destroy function
31+
deinit {
32+
print("ACMNetworking deinited")
5533
}
5634

5735
/// Cancels the current network request
5836
public func cancel() {
59-
task?.cancel()
60-
task = nil
37+
cancelRequestTask()
38+
cancelDownloadTask()
39+
session?.invalidateAndCancel()
40+
session = nil
41+
taskProgress?.invalidate()
42+
taskProgress = nil
43+
mainEndpoint = nil
44+
}
45+
46+
private func cancelRequestTask() {
47+
if requestTask?.state == .running {
48+
requestTask?.cancel()
49+
}
50+
requestTask = nil
51+
}
52+
53+
private func cancelDownloadTask() {
54+
if downloadTask?.state == .running {
55+
downloadTask?.cancel()
56+
}
57+
downloadTask = nil
6158
}
6259
}

Sources/ACMNetworking/Library/Callbacks/ACMGenericCallbacks.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ public enum ACMGenericCallbacks {
1414
public typealias InfoCallback = ((Bool?, Error?) -> Void)?
1515
/// Success callback with generic response for closures
1616
public typealias ResponseCallback<T> = ((T) -> Void)?
17+
/// Success callback with generic response for closures
18+
public typealias DownloadCallback = ((ACMDownloadModel) -> Void)?
19+
/// Progress callback with generic response for closures
20+
public typealias ProgressCallback = ((ACMProgressModel) -> Void)?
1721
}

Sources/ACMNetworking/Library/Constants/ACMNetworking/ACMNetworkingConstants.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
//
44

55
enum ACMNetworkingConstants {
6-
static var configOverride: Bool = false
6+
static var configOverride: Bool? = false
77
}

Sources/ACMNetworking/Library/Constants/NetworkMessages/ACMNetworkConstants.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public enum ACMNetworkConstants {
4242
public static var httpBodyMultipart = "Multipart data, length: %@"
4343
/// Info message for retry mechanism
4444
public static var httpRetryCount = "Current retry count is %d, total retry count is %d"
45+
/// Error message if data is invalid and could not be parsed
46+
public static var genericErrorMessage = "Generic error : %@"
4547
}
4648

4749
public extension ACMNetworkConstants {
@@ -52,12 +54,12 @@ public extension ACMNetworkConstants {
5254
}
5355

5456
/// Header for holding multipart header with content type
55-
static func multipartHeader(model: ACMMultipartContentTypeModel) -> ACMHeaderModel {
56-
ACMHeaderModel(field: "Content-Type", value: ACMStringUtils.shared.merge(list: [
57+
static func multipartHeader(model: ACMMultipartContentTypeModel, utils: ACMStringUtils?) -> ACMHeaderModel {
58+
ACMHeaderModel(field: "Content-Type", value: utils?.merge(list: [
5759
model.type,
5860
" ",
5961
model.boundary,
60-
]))
62+
]) ?? "")
6163
}
6264

6365
/// Header for holding multipart accept type

Sources/ACMNetworking/Library/Extensions/ACMNetworking+Extensions.swift

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,60 +7,65 @@ import Foundation
77
extension ACMNetworking {
88
func baseRequest(to endpoint: ACMBaseEndpoint) -> URLRequest? {
99
guard let urlRequest = endpoint.urlRequest else {
10-
ACMBaseLogger.error(ACMNetworkConstants.urlRequestErrorMessage)
10+
endpoint.logger?.error(ACMNetworkConstants.urlRequestErrorMessage)
1111
return nil
1212
}
1313

14-
let info = ACMStringUtils.shared.merge(list: [
14+
var infoList = [
1515
ACMNetworkConstants.httpRequestType,
16-
endpoint.method.rawValue,
17-
])
18-
ACMBaseLogger.info(info)
16+
]
17+
18+
if let methodRaw = endpoint.method?.rawValue {
19+
infoList.append(methodRaw)
20+
}
21+
22+
let info = endpoint.stringUtils?.merge(list: infoList)
23+
endpoint.logger?.info(info)
1924

2025
if let url = endpoint.url {
21-
let info = ACMStringUtils.shared.merge(list: [
26+
let info = endpoint.stringUtils?.merge(list: [
2227
ACMNetworkConstants.httpURLMessage,
2328
"\(url)",
2429
])
25-
ACMBaseLogger.info(info)
30+
endpoint.logger?.info(info)
2631
}
2732

2833
if let authHeader = endpoint.authHeader {
29-
let info = ACMStringUtils.shared.merge(list: [
34+
let info = endpoint.stringUtils?.merge(list: [
3035
ACMNetworkConstants.httpAuthHeadersMessage,
3136
"\(authHeader)",
3237
])
33-
ACMBaseLogger.info(info)
38+
endpoint.logger?.info(info)
3439
}
3540

3641
if let headers = endpoint.headers, headers.count > 0 {
37-
let info = ACMStringUtils.shared.merge(list: [
42+
let info = endpoint.stringUtils?.merge(list: [
3843
ACMNetworkConstants.httpHeadersMessage,
3944
"\(headers)",
4045
])
41-
ACMBaseLogger.info(info)
46+
endpoint.logger?.info(info)
4247
}
4348

4449
if let queryItems = endpoint.queryItems, queryItems.count > 0 {
45-
let info = ACMStringUtils.shared.merge(list: [
50+
let info = endpoint.stringUtils?.merge(list: [
4651
ACMNetworkConstants.httpQueryItemsMessage,
4752
"\(queryItems)",
4853
])
49-
ACMBaseLogger.info(info)
54+
endpoint.logger?.info(info)
5055
}
5156

5257
if let params = endpoint.params {
53-
let info = ACMStringUtils.shared.merge(list: [
58+
let info = endpoint.stringUtils?.merge(list: [
5459
ACMNetworkConstants.httpBodyMessage,
5560
params.paramsRaw,
5661
])
57-
ACMBaseLogger.info(info)
62+
endpoint.logger?.info(info)
5863
} else if let data = endpoint.mediaData {
59-
let info = ACMStringUtils.shared.merge(list: [
64+
let info = endpoint.stringUtils?.merge(list: [
6065
ACMNetworkConstants.httpBodyMessage,
6166
String(format: ACMNetworkConstants.httpBodyMultipart, "\(data.length)"),
6267
])
63-
ACMBaseLogger.info(info)
68+
endpoint.logger?.info(info)
6469
}
6570

6671
return urlRequest
@@ -75,13 +80,13 @@ extension ACMNetworking: URLSessionTaskDelegate {
7580
/// - task: URL session task
7681
/// - didFinishCollecting: Metrics that gathered
7782
public func urlSession(_: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
78-
let message = ACMStringUtils.shared.merge(list: [
83+
let message = mainEndpoint?.stringUtils?.merge(list: [
7984
"didFinishCollecting",
8085
task.description,
8186
"metrics",
8287
"\(metrics.taskInterval)",
8388
])
84-
ACMBaseLogger.info(message)
89+
logger?.info(message)
8590
}
8691

8792
/// URL Session taskIsWaitingForConnectivity
@@ -90,11 +95,11 @@ extension ACMNetworking: URLSessionTaskDelegate {
9095
/// - session: URL Session
9196
/// - task: URL session task
9297
public func urlSession(_: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
93-
let message = ACMStringUtils.shared.merge(list: [
98+
let message = mainEndpoint?.stringUtils?.merge(list: [
9499
"taskIsWaitingForConnectivity",
95100
task.description,
96101
])
97-
ACMBaseLogger.info(message)
102+
logger?.info(message)
98103
}
99104

100105
/// URL Session didSendBodyData
@@ -106,7 +111,7 @@ extension ACMNetworking: URLSessionTaskDelegate {
106111
/// - totalBytesSent
107112
/// - totalBytesExpectedToSend
108113
public func urlSession(_: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
109-
let message = ACMStringUtils.shared.merge(list: [
114+
let message = mainEndpoint?.stringUtils?.merge(list: [
110115
"task",
111116
task.description,
112117
"didSendBodyData",
@@ -116,6 +121,6 @@ extension ACMNetworking: URLSessionTaskDelegate {
116121
"totalBytesExpectedToSend",
117122
"\(totalBytesExpectedToSend)",
118123
])
119-
ACMBaseLogger.info(message)
124+
logger?.info(message)
120125
}
121126
}

0 commit comments

Comments
 (0)