невозможно загрузить данные с помощью ViewModel - PullRequest
0 голосов
/ 29 мая 2018
  • Источник данных tableView правильно настроен в IB
  • Идентификатор viewController также правильно установлен в IB

это мой viewModel

class StatusCodeViewModel {

    let apiClient = APIClient.shared
    var statusCodes: [StatusCode] = []
    let identifier = "statusCodeCell"

    init() {}


    func loadStatusCodes() {
        apiClient.execute(service: .statusCode) { statusCodes in
            self.statusCodes = statusCodes
        }
    }

}

и viewController , в который я хочу загрузить данные

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var viewModel: StatusCodeViewModel? {
        didSet {
            if viewModel!.statusCodes.count > 0 {
                self.tableView.reloadData()
            }
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel = StatusCodeViewModel()
        viewModel!.loadStatusCodes()
    }
}

extension ViewController : UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let statusCodes = viewModel!.statusCodes as? [StatusCode] {
            return statusCodes.count
        }
        return 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: viewModel!.identifier)
        cell?.textLabel!.text = viewModel!.statusCodes[indexPath.row].title
        return cell!
    }


}

количество данных равно 0, и данные не отображаются вТаблица вида

1 Ответ

0 голосов
/ 29 мая 2018

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

Вам нужно будет реализовать какой-то обратный вызов, когда API вернет вызов - самый простой способ - протокол.

protocol StatusCodeViewModelDelegate {
    func callFinished()
}

class StatusCodeViewModel {

    let apiClient = APIClient.shared
    var statusCodes: [StatusCode] = []
    let identifier = "statusCodeCell"
    var delegate : StatusCodeViewModelDelegate?

    init() {}


    func loadStatusCodes() {
        apiClient.execute(service: .statusCode) { statusCodes in
            self.statusCodes = statusCodes
            delegate?.callFinished()
        }
    }

}

Тогда в вашем viewController:

override func viewDidLoad() {
    super.viewDidLoad()
    viewModel = StatusCodeViewModel()
    viewModel.delegate = self
    viewModel!.loadStatusCodes()
}

func callFinished() {
    self.tableView.reloadData()
}

Не забудьте расширить для только что сделанного вами делегата:

class ViewController: UIViewController, StatusCodeViewModelDelegate {

Или, как предложил @rmaddy, в View change change loadStatusCodes до:

func loadStatusCodes(completion: @escaping () -> Void) {
    apiClient.execute(service: .statusCode) { statusCodes in
        self.statusCodes = statusCodes
    }
}

Затем в viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    viewModel = StatusCodeViewModel()
    viewModel!.loadStatusCodes {
        self.tableView.reloadData()
    }
}
...