Как заставить HTTP-запрос загружаться вовремя перед ячейкой табличного представления - PullRequest
0 голосов
/ 27 января 2019

Возможно, мне не хватает дизайна или простой детали, поскольку я новичок в iOS, но не могу понять это:

У меня есть func с именем getWeatherData(), чтона основе местоположения, полученного от другого контроллера представления, получает погодные условия из запроса http и назначает его HikeModel.Эта функция вызывается в методе ViewDidLoad().

. После того, как func получает данные о погодных условиях, она передает это в дочерний контроллер вида.Какой дочерний VC является контроллером табличного представления.Проблема в том, что моя TableViewCell загружается быстрее, чем требуется для выполнения http-запроса, в родительском контроллере представления.И когда метки ячеек и изображения пытаются получить информацию, которой должны быть присвоены значения, их ничто, поскольку запрос http не завершился вовремя.

Я также попытался использовать DispatchQueue.main.async, но без разницыбыл показан.

Я делаю собственный запрос http со Swift4.

Более подробно о структуре моего проекта я делаю на основе этой работы: https://medium.com/@phillfarrugia/re-creating-the-siri-shortcuts-drawer-interaction-9b2bc94e0b05

В ViewDidLoad

let group = DispatchGroup()

group.enter()

DispatchQueue.main.sync {
    self.getWeatherData(hikeLocation: self.startHikeLocationString)
    group.leave()
}

Метод отправки информацииfillDrawer, с тем, что должно содержать переменные погоды, назначенные для HikeModel.

private func configureDrawerViewController() {
    let compressedHeight = ExpansionState.height(forState: .compressed, inContainer: view.bounds)
    let compressedTopConstraint = view.bounds.height - compressedHeight
    containerViewTopConstraint.constant = compressedTopConstraint
    previousContainerViewTopConstraint = containerViewTopConstraint.constant

    // NB: Handle this in a more clean and production ready fashion.
    if let drawerViewController = children.first as? DrawerViewController {
        //send distnace too
        drawerViewController.delegate = self
        drawerViewController.fillDrawer(hike: self.hikeModel, userLocation: self.userLocation) 
    }

TableView CellsForRowAt

cell.temperature.text = hikeModel.temperature
cell.weather.text = hikeModel.weather
cell.weatherIcon.text = hikeModel.weatherIcon
cell.humidity.text = hikeModel.humidity
cell.barometer.text = hikeModel.barometer
cell.sunrise.text = hikeModel.sunrise
cell.sunset.text = hikeModel.sunset

Я ожидаю загрузки tableViewCell в дочерний контроллер после выполнения запроса http в родительском контроллере представления.

1 Ответ

0 голосов
/ 27 января 2019

Ваш код неполон для определения проблемы, но вы должны сделать следующее:

1) затем загрузить данные из веб-службы,

2) перезагрузить tableView

В вашем ViewDidLoad

let group = DispatchGroup()
        group.enter()

        DispatchQueue.main.sync {
            self.getWeatherData(hikeLocation: self.startHikeLocationString)
           group.leave()
        }

добавить строку после завершения процесса моделирования данных, и она должна быть в mainQueue

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