You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVVM架构下Pokemon API数据无法通过Delegate传递问题

问题解决:MVVM架构下Delegate传递宝可梦数据失败

核心问题

你的代码里MainViewModel的delegate属性从未被赋值,导致ViewModel成功解析数据后,无法找到代理对象去调用didUpdatePokemon方法——这就是代理回调没触发的根本原因。

修复步骤

  1. 在MainViewController中绑定代理
    在viewDidLoad方法里,调用viewModel.fetchPokemon()之前,添加一行代码将ViewModel的代理设置为当前控制器:
// MainViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .systemGray6

    setUpView()
    setUpLayout()
    // 新增:绑定代理
    viewModel.delegate = self
    viewModel.fetchPokemon()
}
  1. 可选但重要:切回主线程更新UI
    URLSession的dataTask回调是在后台线程执行的,如果后续要在didUpdatePokemon里更新UI(比如刷新TableView),必须切回主线程,否则会导致UI异常:
// MainView+Delegates.swift
extension MainViewController: MainViewDelegate {
    func didFailWithError(error: Error) {
        print(error)
    }

    func didUpdatePokemon(pokemons: [PokemonModel]) {
        // 切回主线程处理UI相关操作
        DispatchQueue.main.async {
            print(pokemons)
            // 这里可以添加刷新UI的代码,比如tableView.reloadData()
        }
    }
}

验证修改

完成以上修改后,再次运行代码,didUpdatePokemon方法就能正常接收并打印宝可梦数组了。


内容的提问来源于stack exchange,提问作者Marcial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:00:22