Забираю валюты с сайта fixer.io и помещаю их в массив внутри viewDidLoad().
Но получается так что массив то заполняется, но Пикер не заполняется сразу. Он заполняется только после того как я на него щелкаю и пытаюсь прокрутить.
import UIKit
import Foundation
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var pickerFrom: UIPickerView!
@IBOutlet weak var pickerTo: UIPickerView!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
var currencies = ["USD", "RUB", "EUR"]
var exchangeRates = [String]()
override func viewDidLoad() {
super.viewDidLoad()
//загрузка данных в первый пикер
let urlString = "https://api.fixer.io/latest"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {return}
guard error == nil else {return}
do {
let json = try JSONSerialization.jsonObject(with: data, options: []) as? Dictionary<String, Any>
if let parsedJSON = json {
//print("Олег")
if let rates = parsedJSON["rates"] as? Dictionary<String, Double> {
for (key, _) in rates {
self.currencies.append(String(key))
print(self.currencies)
}
}
}
} catch {
print(error)
}
self.pickerFrom.reloadAllComponents()
}.resume()
// Do any additional setup after loading the view, typically from a nib.
self.label.text = "Тут будет курс"
self.pickerTo.dataSource = self
self.pickerFrom.dataSource = self
self.pickerTo.delegate = self
self.pickerFrom.delegate = self
//
// self.requestCurrencyRates(baseCurrency: “RUB”) {
// (data, error) in
// }
self.activityIndicator.hidesWhenStopped = true
self.requestCurrentCurrencyRate()
//
// self.retrieveCurrencyRate(baseCurrency: “USD”, toCurrency: “RUB”) {[weak self] (value) in
// DispatchQueue.main.async(execute: {
// if let strongSelf = self {
// strongSelf.label.text = value
// }
// })
// }
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView === pickerTo {
return self.currenciesExceptBase().count
}
return currencies.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView === pickerTo {
return self.currenciesExceptBase()[row]
}
return currencies[row]
}
//Получаем данные
func requestCurrencyRates(baseCurrency: String, parseHandler: @escaping (Data?, Error?) -> Void) {
let url = URL(string: "https://api.fixer.io/latest?base=" + baseCurrency)!
let dataTask = URLSession.shared.dataTask(with: url) {
(dataReceived, response, error) in
parseHandler(dataReceived, error)
}
dataTask.resume()
}
//Парсинг
func parseCurrencyRatesResponse(data: Data?, toCurrency: String) -> String {
var value : String = ""
do {
let json = try JSONSerialization.jsonObject(with: data!, options: []) as? Dictionary<String, Any>
if let parsedJSON = json {
print("\(parsedJSON)")
if let rates = parsedJSON["rates"] as? Dictionary<String, Double> {
for (key, _) in rates {
self.currencies.append(String(key))
}
if let rate = rates[toCurrency] {
value = "\(rate)"
} else {
value = "No rate fo currency \"\(toCurrency)\" found"
}
} else {
value = "No \"rates\" field found"
}
} else {
value = "No JSON value parsed"
}
} catch {
value = error.localizedDescription
}
return value
}
func retrieveCurrencyRate(baseCurrency: String, toCurrency: String, completion: @escaping (String) -> Void) {
self.requestCurrencyRates(baseCurrency: baseCurrency) { [weak self] (data, error) in
var string = "No currency retrieved"
if let currentError = error {
string = currentError.localizedDescription
} else {
if let strongSelf = self {
string = strongSelf.parseCurrencyRatesResponse(data: data, toCurrency: toCurrency)
}
}
completion(string)
}
}
//взаимодействие с пользователем
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView === pickerFrom {
self.pickerTo.reloadAllComponents()
}
self.requestCurrentCurrencyRate()
}
func currenciesExceptBase() -> [String] {
var currenciesExceptBase = currencies
currenciesExceptBase.remove(at: pickerFrom.selectedRow(inComponent: 0))
return currenciesExceptBase
}
func requestCurrentCurrencyRate() {
self.activityIndicator.startAnimating()
self.label.text = ""
let baseCurrencyIndex = self.pickerFrom.selectedRow(inComponent: 0)
let toCurrencyIndex = self.pickerTo.selectedRow(inComponent: 0)
let baseCurrency = self.currencies[baseCurrencyIndex]
let toCurrency = self.currenciesExceptBase()[toCurrencyIndex]
self.retrieveCurrencyRate(baseCurrency: baseCurrency, toCurrency: toCurrency) {[weak self]
(value) in
DispatchQueue.main.async(execute: {
if let strongSelf = self {
strongSelf.label.text = value
strongSelf.activityIndicator.stopAnimating()
}
})
}
}
}