// // ForayNetworkManager.swift // foray // // Created by Nicholas Tay on 20/3/2022. // import Foundation class ForayNetworkManager { static let shared = ForayNetworkManager() var basicUsername: String? = nil var basicPassword: String? = nil // Reuse JSON decoder, allows for customisation of things like date decode if required var jsonDecoder: JSONDecoder = { let jd = JSONDecoder() // Defaults to year-month-date format jd.dateDecodingStrategy = .custom({ (decoder) -> Date in let container = try decoder.singleValueContainer() let dateStr = try container.decode(String.self) let dateFormat = DateFormatter() dateFormat.dateFormat = "yyyy-MM-dd" return dateFormat.date(from: dateStr)! }) return jd }() func get(url: String, onComplete: @escaping ([T]) -> ()) { var request = URLRequest(url: URL(string: url)!) request.cachePolicy = .reloadRevalidatingCacheData // Needed otherwise default caching policy seems not to check properly // Basic auth if required if (basicUsername != nil && basicPassword != nil) { let authData = (basicUsername! + ":" + basicPassword!).data(using: .utf8)!.base64EncodedString() request.addValue("Basic \(authData)", forHTTPHeaderField: "Authorization") } URLSession.shared.dataTask(with: request, completionHandler: { data, response, error -> Void in let items = try! self.jsonDecoder.decode([T].self, from: data!) // Possibly passing back to UI, need to do it on the main thread (I think due to async?) DispatchQueue.main.async { onComplete(items) } }).resume() } }