iOS Swift - данные не выбираются достаточно быстро, чтобы добраться до другого UIViewController
У меня есть контроллер представления источника и контроллер представления назначения. Я хотел бы показать данные, извлеченные из URL-адреса в пользовательском интерфейсе (назначение) сразу после перехода к этому экрану (переход "показать").
Для этого в исходном VC я использую метод "prepare to segue", где я вызываю функцию, которая возвращает массив со всеми извлеченными данными, которые я хочу показать, и передаю его в VC назначения, который будет показан в UITableView., Проблема в том, что много раз целые данные не извлекаются из URL, поэтому я передаю пустой массив в место назначения.
Это код в исходном VC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationVc = segue.destination as?
ShowCharacterInfoViewController{
fetchCharacterArrayFromUrl(characterName: cellContent){ results in
destinationVc.array.append(contentsOf:results)
destinationVc.tabelView.reloadData()}
} }
Я не могу придумать правильного решения.
2 ответа
Вы можете сделать одну из двух вещей.
- Загрузите данные и выполните переход только после того, как функция вернула данные.
Перейдите к экрану назначения, и этот контроллер загрузит данные в viewWillAppear.
// Add a place to save the results var saveResults: MyResultsType? @IBAction func someButtonAction(_ sender: Any) { // Consider putting a "Loading..." dialog here fetchCharacterArrayFromUrl(characterName: cellContent){ results in self.saveResults = results DispatchQueue.main.async({ // Hide the "Loading..." dialog performSegue(withIdentifier: "ID of your Segue", sender: sender) // }) } } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let destinationVc = segue.destination as? ShowCharacterInfoViewController { // I'm not sure append() is really what you need here destinationVc.array.append(contentsOf: savedResults) destinationVc.tabelView.reloadData() } }
Вам нужно обновить интерфейс в основном потоке, так как вы выполняете внутренний вызов:-
DispatchQueue.main.async({
destinationVc.tabelView.reloadData()
})