Skip to content

Commit 95be7d4

Browse files
author
Burak Colak
committed
🎷 [UPDATE] Download support added.
1 parent 3536480 commit 95be7d4

File tree

5 files changed

+63
-21
lines changed

5 files changed

+63
-21
lines changed

Sources/ACMNetworking/ACMNetworking.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Foundation
88
public class ACMNetworking: NSObject {
99
var requestTask: URLSessionDataTask?
1010
var downloadTask: URLSessionDownloadTask?
11+
var taskProgress: NSKeyValueObservation?
1112

1213
/// Public Init function
1314
/// For creating object with SDK

Sources/ACMNetworking/Library/Callbacks/ACMGenericCallbacks.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ public enum ACMGenericCallbacks {
1616
public typealias ResponseCallback<T> = ((T) -> Void)?
1717
/// Success callback with generic response for closures
1818
public typealias DownloadCallback = ((ACMDownloadModel) -> Void)?
19+
/// Progress callback with generic response for closures
20+
public typealias ProgressCallback = ((ACMProgressModel) -> Void)?
1921
}

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

Lines changed: 2 additions & 0 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 {

Sources/ACMNetworking/Library/MainCalls/ACMNetworking+Download.swift

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,46 +19,63 @@ public extension ACMNetworking {
1919
/// - Returns:
2020
/// - Void
2121
func download(to endpoint: ACMBaseEndpoint,
22-
currentRetryCount: Int? = 0,
23-
onSuccess: ACMGenericCallbacks.DownloadCallback,
24-
onError: ACMGenericCallbacks.ErrorCallback)
22+
currentRetryCount _: Int? = 0,
23+
onSuccess: ACMGenericCallbacks.DownloadCallback,
24+
onProgress: ACMGenericCallbacks.ProgressCallback = nil,
25+
onError: ACMGenericCallbacks.ErrorCallback = nil)
2526
{
2627
guard let urlRequest = generateURLRequest(endpoint: endpoint) else { return }
2728

2829
downloadTask = endpoint.session(delegate: self).downloadTask(with: urlRequest) { [weak self] url, urlResponse, error in
2930
guard let self else { return }
3031

3132
self.handleNilErrorResponse(with: endpoint, error: error, onError: onError)
33+
self.handleNilResponse(with: endpoint, response: urlResponse, onError: onError)
3234
self.handleConnectivityError(with: endpoint, error: error, onError: onError)
3335

34-
guard let url else { return }
35-
36-
guard let urlResponse else { return }
36+
guard let url,
37+
let urlResponse,
38+
let httpResponse = self.handleHttpResponse(with: endpoint, response: urlResponse, onError: onError),
39+
let pathExtension = httpResponse.url?.pathExtension
40+
else {
41+
self.cancel()
42+
return
43+
}
3744

3845
self.cancel()
46+
self.taskProgress?.invalidate()
47+
self.taskProgress = nil
3948

4049
do {
41-
let data = try Data(contentsOf: url)
42-
43-
let model = ACMDownloadModel(data: data, localURL: url, response: urlResponse)
44-
onSuccess?(model)
45-
} catch {}
50+
let searchUrl = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
51+
let destinationDirectory = searchUrl
52+
.appendingPathComponent("ACMNetworking")
4653

54+
if !FileManager.default.fileExists(atPath: destinationDirectory.relativePath) {
55+
try FileManager.default.createDirectory(at: destinationDirectory, withIntermediateDirectories: true)
56+
}
4757

48-
/* guard let data = self.handleData(with: endpoint, data: data, onError: onError) else { return }
49-
guard let httpResponse = self.handleHttpResponse(with: endpoint, response: response, onError: onError) else { return }
58+
let destination = destinationDirectory.appendingPathComponent(url.lastPathComponent)
59+
.appendingPathExtension(pathExtension)
5060

51-
// Check if response is in valid http range
52-
guard self.validateResponse(with: httpResponse) else {
53-
self.executeRetry(with: endpoint, httpResponse: httpResponse, data: data, currentRetryCount: currentRetryCount, onSuccess: onSuccess, onError: onError)
54-
return
55-
}
61+
try FileManager.default.moveItem(at: url, to: destination)
5662

57-
self.cancel()
63+
let data = try Data(contentsOf: destination)
5864

59-
self.handleResult(with: endpoint, data: data, onSuccess: onSuccess, onError: onError)
60-
*/
65+
let model = ACMDownloadModel(data: data, localURL: destination, response: urlResponse)
66+
onSuccess?(model)
67+
} catch let e {
68+
let errorMessage = String(format: ACMNetworkConstants.genericErrorMessage, e.localizedDescription)
69+
ACMBaseLogger.warning(errorMessage)
70+
onError?(ACMBaseNetworkError(message: ACMNetworkConstants.errorMessage, log: errorMessage, endpoint: endpoint))
71+
}
6172
}
73+
74+
taskProgress = downloadTask?.progress.observe(\.fractionCompleted, changeHandler: { progress, _ in
75+
let model = ACMProgressModel(progress: progress.fractionCompleted)
76+
onProgress?(model)
77+
})
78+
6279
downloadTask?.resume()
6380
}
6481
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// ACMProgressModel.swift
3+
//
4+
//
5+
// Created by Burak on 28.12.2023.
6+
//
7+
8+
import Foundation
9+
10+
public struct ACMProgressModel {
11+
public var progress: Double
12+
public func formatted(with format: String = "%.2f") -> String {
13+
return String(format: format, progress)
14+
}
15+
16+
public func formattedPercentage(with format: String = "%.f") -> String {
17+
let percentageProgress = progress * 100
18+
return String(format: format, percentageProgress)
19+
}
20+
}

0 commit comments

Comments
 (0)