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

SwiftUI Combine框架中receiveValue内代码未执行问题排查

问题分析与解决方案

问题根源

你的TrendingResponse结构体自定义了init(from decoder:)方法,但这个方法是空实现——它完全跳过了JSON解码的核心逻辑。虽然语法上合法,但它既没有把API返回的JSON数据解析到结构体属性中,还会导致JSONDecoder无法生成有效实例,最终使得receiveValue闭包无法触发(即使解码流程没抛出错误,也不会传递数据到receiveValue)。

解决方案

  1. 删除自定义解码初始化方法
    直接移除TrendingResponse中的init(from decoder:),让结构体使用Decodable协议的默认实现。因为你的属性都是可选类型,且字段名和API返回的JSON字段完全匹配,默认实现会自动完成解码工作。

修改后的TrendingResponse代码:

struct TrendingResponse: Decodable {
    let page: Int?
    let results: [Movie]?
    let total_pages: Int?
    let total_results: Int?
}
  1. 确保Movie结构体符合解码要求
    检查Movie结构体是否正确实现了Decodable协议,所有需要解析的属性字段名要和JSON返回的字段一致,否则解码时会抛出错误,进入sink的failure分支。

额外优化建议

  • 可以在解码前添加日志,打印原始JSON数据,确认数据格式是否符合预期:
.map(\.data)
.handleEvents(receiveOutput: { data in
    if let jsonString = String(data: data, encoding: .utf8) {
        print("Raw JSON: \(jsonString)")
    }
})
.decode(type: TrendingResponse.self, decoder: JSONDecoder())
  • 如果后续需要更新UI,把receive(on:)的队列改成主队列(DispatchQueue.main),避免后台线程操作UI引发异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:17:38