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

Swift中Model与ViewController数据交互时Delegate返回nil问题排查

问题根因
  • 异步时序问题:URLSession.shared.dataTask是后台异步执行的任务,你在viewDidLoad中调用fetchData方法后,代码不会等待网络请求返回就会立刻向下执行self.datadetail == nil的判断,此时delegate回调方法还未被触发,datadetail自然为nil。
  • 类型不匹配隐患:Model层JSON解码得到的是MealDetail类型,但delegate协议要求传递的参数是DataDetailItem类型,若两者没有做兼容转换,也会导致传递数据异常。
修复方案
  1. 把UI更新逻辑迁移到delegate回调方法中,确保只有数据返回后才执行UI赋值操作,修改后的DetailViewController相关代码如下:
override func viewDidLoad() {
    super.viewDidLoad()
    model.datadetaildelegate = self   
    model.fetchData(ID: data.id)
}

func datadetailFetched(_ datadetail: DataDetailItem) {
    self.datadetail = datadetail
    // 数据返回后再更新UI
    self.instruction.text = datadetail.instruction
}
  1. 确认Model层解码后的MealDetail类型和DataDetailItem的兼容性,若为不同类型需要补全转换逻辑后再调用delegate方法:
// Model中解码后补全类型转换逻辑示例
let response = try decoder.decode(MealDetail.self, from: data!)
// 转换为DataDetailItem类型再传递
let detailItem = DataDetailItem(from: response)
DispatchQueue.main.async {
    self.datadetaildelegate?.datadetailFetched(detailItem)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:27:03