如何在正确启动前从后台加载服务器数据

How to load data from server in a background before launch properly

我正在处理这样的问题:我必须从服务器获取数据并将其绑定到我的 pickerView。但是现在,在第一次启动时我得到空的选择器,因为在 viewDidLoad()

之后执行检索函数

那么,我能否以某种方式在 viewDidLoad() 之前获取数据?

我试过使用 DispatchQueue.global(qos: .background).async 来检索数据,但看起来它以不正确的方式完成。

var currencies = [String]()
override func viewDidLoad() {
    super.viewDidLoad()
    setDelegates()
    setupLabelInPicker()
    updatePickerInfoBeforeStart()
}

func updatePickerInfoBeforeStart() {
    DispatchQueue.global(qos: .background).async {
        self.retrieveCurrency{ [weak self]
            currencies in self?.currencies = currencies
        }

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

检索数据的方法:

func retrieveCurrency(completion: @escaping ([String]) -> Void) {
    requestCurrencyRates { [unowned self] (data, error) in

        if error != nil {
            fatalError()
        } else {
             comletion(self.parseCurrensyResponse(data: data))
        }
    }
}

将数据绑定到选择器:

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return currencies[row]
}

是否存在针对此类任务的通用方法?

IMO 你可以通过以下方法做到这一点:

1)在应用启动时获取所需数据

您可以创建一个 虚拟启动画面 与启动时 UI 完全一样 storyboard 并且您可以从中获取 data server.Later 您只需在需要时将此数据传递给 pickerView

2)如果你只是需要在一个特定的ViewController

在这种情况下,您可以从服务器中获取 data viewController itself.You 可以在获取数据的同时显示加载器。