Я работаю с динамическим c URL-адресом, который меняется каждый раз, когда я добавляю новую пару currencyPair. Тем не менее, он добавляет новую пару каждый раз, когда запускается приведенный ниже apiTimer, и конечная точка URL увеличивается каждую секунду. Однако он должен добавляться только при добавлении новой валютной пары в MainTableViewController, а не каждую секунду.
Вот что я пробовал до сих пор:
- Изменена конечная точка: String on забавный c запрос () к конечной точке: URLParameters.
- Изменены параметры функции.
- Перестройка функции таймера.
Любое представление о том, что проблема и как ее исправить?
Заранее спасибо
import Foundation
class NetworkEngine {
/// Executes the web call and will decode the JSON response into Codable object provided
/// - Parameters:
/// - endpoint: the endpoint to make the HTTP request against
/// - completion: the JSON response converted to the provided Codable object, if successful, or failure otherwise
static let shared = NetworkEngine()
func request<T: Codable>(_ endpoint: String, completion: @escaping (Result<T, Error>) -> ()) {
guard let url = URL(string: endpoint) else {
return
}
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "GET"
print(urlRequest, "respponse2")
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: urlRequest) { (data, response, error) in
guard error == nil else {
completion(.failure(error!))
print(error?.localizedDescription ?? "Unknown error")
return
}
guard response != nil, let safeData = data else { return }
DispatchQueue.main.async {
if let responseObject = try? JSONDecoder().decode(T.self, from: safeData) {
completion(.success(responseObject))
} else {
let error = NSError(domain: "", code: 200, userInfo: [NSLocalizedDescriptionKey : "Failed to decode response"])
completion(.failure(error))
print(error)
}
}
}
dataTask.resume()
}
}
lazy var apiTimer: Timer = {
var timer = Timer()
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(urlFetch), userInfo: nil, repeats: true)
return timer
}()
@objc fileprivate func urlFetch() {
guard let endpoint = currencyPairModel.getUrlComponent().url?.absoluteString else { return }
NetworkEngine.shared.request(endpoint) { [weak self] (result: Result<[String: Double], Error>) in
switch result {
case .success(let rateResults):
DispatchQueue.main.async {
print("TESTTTTT")
let cells = self?.currencyListTableView.visibleCells as! [CurrencyListTableViewCell]
for cell in cells {
print(cell,"cell")
print(cells,"cells")
for key in rateResults.keys {
if key == cell.currencyPair.currencyPairKey {
print(key,"key")
cell.currencyPair.addRate(rateResults)
print(rateResults,"rateResults")
print(rateResults.keys,"rateResults.keys")
self?.currencyListTableView.beginUpdates()
cell.rate = cell.currencyPair?.getRate()
self?.currencyListTableView.endUpdates()
}
}
}
}
case .failure(let error):
self?.showAlert(with: "Error!", message: error.localizedDescription)
}
}
}
mutating func getUrlComponent() -> URLComponents {
for currencyPair in currencyPairs {
let param = URLQueryItem(name: "pairs", value: currencyPair.currencyPairKey)
components.queryItems?.append(param)
}
return components
}