Swift 3中从JSON数组更新表格时按字母排序引发错误
看起来你已经走对了大半路——排序后的打印结果正确说明逻辑没问题,问题大概率出在数据源更新和表格刷新的衔接上。我帮你梳理几个最可能的坑,一步步排查:
1. 确认排序后的数组真的替换了表格数据源
首先检查你是不是只做了排序,但没把排序后的数组赋值给 tableView 依赖的数据源变量。比如如果你的数据源是 var shows: [ShowModel] = [],那排序后必须写:
// 用Swift更推荐的闭包写法,比compare更直观,还支持本地化排序 let sortedShows = shows.sorted { $0.show_name.localizedStandardCompare($1.show_name) == .orderedAscending } // 关键:替换原数据源,这步不能少! self.shows = sortedShows
如果只是临时排序但没更新原数组,表格自然还是用旧的未排序数据。
2. 必须在主线程刷新表格
JSON解析和网络请求通常是在后台线程执行的,如果你直接在后台线程调用 tableView.reloadData(),会触发UI线程异常。解决方法是把刷新操作切回主线程:
// 排序完成后,回到主线程更新UI DispatchQueue.main.async { self.tableView.reloadData() }
这是iOS开发里的高频坑,很多时候打印正确但表格不对,都是线程问题导致的。
3. 处理可选值和空字符串的边界情况
如果你的 show_name 可能为 nil 或者空字符串,排序时要做兼容,避免崩溃:
let sortedShows = shows.sorted { let name1 = $0.show_name ?? "" let name2 = $1.show_name ?? "" return name1.localizedStandardCompare(name2) == .orderedAscending }
用 localizedStandardCompare 比直接用 < 更好,它会处理本地化的排序规则(比如带重音的字符、大小写)。
4. 完整的extract_json函数示例
结合你给出的代码片段,完整的正确写法大概是这样:
func extract_json(_ data: Data) { var json: Any? do { json = try JSONSerialization.jsonObject(with: data, options: []) // 假设你的JSON结构是包含shows数组的字典 guard let jsonDict = json as? [String: Any], let showsArray = jsonDict["shows"] as? [[String: Any]] else { print("JSON结构不匹配") return } // 转成模型数组(这里假设你有ShowModel模型) var shows = showsArray.compactMap { ShowModel(json: $0) } // 按show_name排序 shows.sort { ($0.show_name ?? "").localizedStandardCompare($1.show_name ?? "") == .orderedAscending } // 主线程更新数据源并刷新表格 DispatchQueue.main.async { self.showsDataSource = shows self.tableView.reloadData() } } catch { print("JSON解析失败:\(error.localizedDescription)") } }
如果还是有问题,建议你把具体的错误信息(比如崩溃日志、表格显示的异常情况)贴出来,这样能更精准定位问题~
内容的提问来源于stack exchange,提问作者darkginger
相关产品推荐
相关产品推荐

