Swift中Model与ViewController数据交互时Delegate返回nil问题排查
问题根因
- 异步时序问题:
URLSession.shared.dataTask是后台异步执行的任务,你在viewDidLoad中调用fetchData方法后,代码不会等待网络请求返回就会立刻向下执行self.datadetail == nil的判断,此时delegate回调方法还未被触发,datadetail自然为nil。 - 类型不匹配隐患:Model层JSON解码得到的是
MealDetail类型,但delegate协议要求传递的参数是DataDetailItem类型,若两者没有做兼容转换,也会导致传递数据异常。
修复方案
- 把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 }
- 确认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
相关产品推荐
相关产品推荐

