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 ответа

Решение

Вы можете сделать одну из двух вещей.

  1. Загрузите данные и выполните переход только после того, как функция вернула данные.
  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()
})
Другие вопросы по тегам