SwiftUI Combine框架中receiveValue内代码未执行问题排查
问题分析与解决方案
问题根源
你的TrendingResponse结构体自定义了init(from decoder:)方法,但这个方法是空实现——它完全跳过了JSON解码的核心逻辑。虽然语法上合法,但它既没有把API返回的JSON数据解析到结构体属性中,还会导致JSONDecoder无法生成有效实例,最终使得receiveValue闭包无法触发(即使解码流程没抛出错误,也不会传递数据到receiveValue)。
解决方案
- 删除自定义解码初始化方法
直接移除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? }
- 确保
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
相关产品推荐
相关产品推荐

