iOS UITableView调用insertRows报Invalid update不一致错误如何解决
崩溃根因
UITableView执行更新操作时会校验数据变动和UI操作的一致性,本次报错的触发逻辑是:
- 执行更新前section 0的行数为0,你调用
append(contentsOf: nComList)后posts数组长度变为10,对应section 0的行数更新后应为10 - 你仅调用
insertRows插入了1行,系统校验时0+1=1与实际行数10不匹配,触发一致性校验异常崩溃。
修复代码
批量生成本次新增数据对应的IndexPath数组,执行批量插入,同时确保UI操作在主线程执行:
var posts: [CommunityListRM.CommunityList] = [] NetworkService().request(.communityList, params, header) { [self] (response: DataResponse<CommunityListRM,AFError>) in switch response.result { case .success(let data): guard let nComList = data.communityList, !nComList.isEmpty else { return } let originalCount = self.posts.count self.posts.append(contentsOf: nComList) // 生成所有新增行的IndexPath let indexPaths = (originalCount..<self.posts.count).map { IndexPath(row: $0, section: 0) } // 切主线程执行UI更新 DispatchQueue.main.async { self.tableview.beginUpdates() self.tableview.insertRows(at: indexPaths, with: .none) self.tableview.endUpdates() } case .failure(let error): // 自定义错误处理逻辑 print(error) } }
额外注意事项
- 需确保
tableView(_:numberOfRowsInSection:)代理方法返回值为posts.count,不可写死固定值 - 如果是下拉刷新替换全量数据的场景,无需使用insertRows,直接更新posts数组后调用
tableView.reloadData()即可 - 上拉加载更多的场景可复用上述批量插入逻辑
内容的提问来源于stack exchange,提问作者JJHA
相关产品推荐
相关产品推荐

