Untitled
unknown
plain_text
a year ago
4.5 kB
9
Indexable
import Alamofire
import UIKit
// Define a generic result type
enum Result<T> {
case success(T)
case failure(Error)
}
// Define a protocol for the NetworkManager to follow
protocol NetworkManagerProtocol {
func request<T: Decodable>(url: String, method: HTTPMethod, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void)
func get<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void)
func post<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void)
func put<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void)
func delete<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void)
func uploadMultipart<T: Decodable>(url: String, params: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void)
}
// Create a generic NetworkManager class
class NetworkManager: NetworkManagerProtocol {
static let shared = NetworkManager()
private init() {}
func request<T: Decodable>(url: String, method: HTTPMethod, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void) {
AF.request(url, method: method, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
.validate()
.responseDecodable(of: T.self) { response in
switch response.result {
case .success(let value):
completion(.success(value))
case .failure(let error):
completion(.failure(error))
}
}
}
func get<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void) {
request(url: url, method: .get, parameters: parameters, headers: headers, completion: completion)
}
func post<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void) {
request(url: url, method: .post, parameters: parameters, headers: headers, completion: completion)
}
func delete<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void) {
request(url: url, method: .delete, parameters: parameters, headers: headers, completion: completion)
}
func put<T: Decodable>(url: String, parameters: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void) {
request(url: url, method: .put, parameters: parameters, headers: headers, completion: completion)
}
func uploadMultipart<T: Decodable>(url: String, params: Parameters?, headers: HTTPHeaders?, completion: @escaping (Result<T>) -> Void) {
// Set a maximum chunk size (e.g., 1 MB)
let maxChunkSize = 1 * 1024 * 1024 // 1 MB
AF.upload(multipartFormData: { multipartFormData in
guard let params = params else { return }
for (key, value) in params {
if let dataValue = value as? Data {
if dataValue.count > maxChunkSize {
// Split large data into smaller chunks
var offset = 0
while offset < dataValue.count {
let chunkSize = min(maxChunkSize, dataValue.count - offset)
let chunk = dataValue.subdata(in: offset..<offset + chunkSize)
multipartFormData.append(chunk, withName: key, fileName: "\(key)_part_\(offset).jpg", mimeType: "image/jpeg")
offset += chunkSize
}
} else {
// If data is smaller than maxChunkSize, upload it directly
multipartFormData.append(dataValue, withName: key, fileName: "\(key).jpg", mimeType: "image/jpeg")
}
} else if let stringValue = value as? String {
multipartFormData.append(Data(stringValue.utf8), withName: key)
} else if let doubleValue = value as? Double {
multipartFormData.append(Data("\(doubleValue)".utf8), withName: key)
} else if let boolValue = value as? Bool {
multipartFormData.append(Data("\(boolValue)".utf8), withName: key)
}
}
}, to: url, headers: headers)
.validate()
.responseDecodable(of: T.self) { response in
switch response.result {
case .success(let value):
completion(.success(value))
case .failure(let error):
completion(.failure(error))
}
}
}
}
Editor is loading...
Leave a Comment