Как вставить ячейки в табличное представление после (не до) вызова API? - PullRequest
0 голосов
/ 15 апреля 2020

Итак, я работаю над погодным приложением. Я обновляю простые UILabel без проблем, но проблема заключается в заполнении TableView данными о погоде, которые я получу от API. В моей ViewController структуре var weatherModel: WeatherModel?, которая будет установлена ​​после того, как я проанализирую JSON данные в ней. Когда пользователь впервые запускает приложение, я получаю его текущее местоположение с CLLocationManager.requestLocation(), вызванным с viewDidLoad(), затем я выполняю вызов API погоды внутри func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]). Затем я обновляю интерфейс. Но, конечно, func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell сработает задолго до того, как мой вызов API завершится, поэтому, когда я пытаюсь развернуть свой weatherModel внутри, я получаю nil. Я установил tableView.datasource и delegate внутри viewDidLoad(). Я попытался запросить местоположение перед установкой tableView.dataSource, например, но это не сработало.

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager.delegate = self
    searchField.delegate = self
    weatherController.delegate = self
    locationManager.requestWhenInUseAuthorization()
    locationManager.requestLocation()
    DataTable.delegate = self
    DataTable.dataSource = self
    DataTable.register(UINib(nibName: "DataCell", bundle: nil), forCellReuseIdentifier: "DataCell")
}

Может быть, мне следует запросить местоположение в viewWillAppear(), чтобы вызов API выполнялся до tableView cellForRowAt срабатывает?

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете установить пустой массив, например var weatherInfoArray:[WeatherModel] = [], поэтому при инициализации табличного представления numberOfItemsInSection равен 0, и вам не нужно беспокоиться о cellForRowAt. И это было бы лучше, если вы на самом деле не знаете, является ли переменная ноль или нет: if let weatherModel = weatherModel {...}, поэтому, если weatherModel - ноль, код никогда не будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...