加载本地JSON文件出现PreviewUpdateTimedOutError更新超时5秒错误如何解决
问题修复方案
错误原因
- JSON文件语法不合法:你提供的data.json存在两处语法错误:result数组末尾的对象多了多余逗号,且数组未闭合、整个JSON根对象未闭合,会导致Data解析直接失败。
- Codable结构体字段与JSON键不匹配:你的
Movie结构体中定义的字段是release_data,但JSON中对应的键是release_date,拼写不一致会导致JSONDecoder解码失败。 - 错误处理逻辑触发预览崩溃:加载函数中使用
try?忽略具体错误,解码失败时直接调用fatalError触发崩溃,Xcode预览加载时崩溃会卡住直到超时,就会抛出你遇到的PreviewUpdateTimedOutError报错。
修复步骤
第一步:修复data.json语法
修正后的合法JSON内容如下:
{ "result": [ { "adult": false, "backdrop_path": "/yizL4cEKsVvl17Wc1mGEIrQtM2F.jpg", "genre_ids": [ 28, 878, 12 ], "id": 588228, "original_language": "en", "original_title": "The Tomorrow War", "overview": "The world is stunned when a group of time travelers arrive from the year 2051 to deliver an urgent message: Thirty years in the future, mankind is losing a global war against a deadly alien species. The only hope for survival is for soldiers and civilians from the present to be transported to the future and join the fight. Among those recruited is high school teacher and family man Dan Forester. Determined to save the world for his young daughter, Dan teams up with a brilliant scientist and his estranged father in a desperate quest to rewrite the fate of the planet.", "popularity": 3368.737, "poster_path": "/34nDCQZwaEvsy4CFO5hkGRFDCVU.jpg", "release_date": "2021-09-03", "title": "The Tomorrow War", "video": false, "vote_average": 7.8, "vote_count": 271 } ] }
第二步:修正Movie结构体字段名
将release_data改为和JSON匹配的release_date:
struct Movie:Codable,Identifiable{ var adult:Bool var backdrop_path:String var genre_ids:[Int] var id:Int var original_language:String var original_title:String var overview:String var popularity:Double var poster_path:String? var release_date:String // 此处修正拼写匹配JSON键 var title:String? var video:Bool var vote_average:Double? var vote_count:Int }
第三步:优化加载函数的错误处理逻辑
替换原有的try?为do-catch捕获具体错误,方便后续排查问题,避免直接触发崩溃:
func loadJsonData() -> [Movie] { let filename : String="data.json" guard let url = Bundle.main.url(forResource: filename, withExtension: nil)else{ fatalError("未找到\(filename)文件") } do { let data = try Data(contentsOf: url) let list = try JSONDecoder().decode(movieData.self, from: data) return list.result } catch { // 控制台打印具体错误信息,方便调试定位问题 print("解析失败:\(error)") fatalError("文件加载或解析失败:\(error.localizedDescription)") } }
完成以上三步后重新运行项目,预览即可正常加载。
内容的提问来源于stack exchange,提问作者Hannah
相关产品推荐
相关产品推荐

