MVVM架构下Pokemon API数据无法通过Delegate传递问题
问题解决:MVVM架构下Delegate传递宝可梦数据失败
核心问题
你的代码里MainViewModel的delegate属性从未被赋值,导致ViewModel成功解析数据后,无法找到代理对象去调用didUpdatePokemon方法——这就是代理回调没触发的根本原因。
修复步骤
- 在MainViewController中绑定代理
在viewDidLoad方法里,调用viewModel.fetchPokemon()之前,添加一行代码将ViewModel的代理设置为当前控制器:
// MainViewController.swift override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemGray6 setUpView() setUpLayout() // 新增:绑定代理 viewModel.delegate = self viewModel.fetchPokemon() }
- 可选但重要:切回主线程更新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
相关产品推荐
相关产品推荐

