Не заполняется Picker, в чем дело?

xcode

#1

Забираю валюты с сайта 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()
            }
        })
    }
    
}

}


#2

Обновляйте пикер в основном потоке:

DispatchQueue.main.async { self.pickerFrom.reloadAllComponents() }

#3

спасибо. разобрался, работает как я хочу.