如何在正确启动前从后台加载服务器数据
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 可以在获取数据的同时显示加载器。
我正在处理这样的问题:我必须从服务器获取数据并将其绑定到我的 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 可以在获取数据的同时显示加载器。