URLParameter добавляется к конечной точке каждую секунду во время извлечения данных, и конечная точка становится слишком большой - PullRequest
0 голосов
/ 02 мая 2020

Я работаю с динамическим 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
    }

1 Ответ

0 голосов
/ 02 мая 2020

Хорошо. Вы вызываете getUrlComponent() метод каждую секунду. В этом методе вы получаете существующие компоненты, добавляете элементы запроса для пар и сохраняете компоненты в переменной экземпляра. Вот почему ваш URL растет каждую секунду. Просто очистите массив элементов запроса в начале метода.

mutating func getUrlComponent() -> URLComponents {
    components.queryItems = []
    for currencyPair in currencyPairs {
        let param = URLQueryItem(name: "pairs", value: currencyPair.currencyPairKey)
        components.queryItems?.append(param)
    }

    return components
}

И это нормально, что у вас есть несколько элементов запроса с одинаковым именем pairs?

...