从API获取JSON填充UITableView时数据延迟显示问题求助
UITableView 数据更新延迟?教你快速解决这个问题
嘿,我一眼就看出你遇到的是什么问题了——这是iOS开发里新手常踩的坑:你更新了数据源数组,但没告诉UITableView要刷新界面!
问题根源
UITableView不会自动监听数组的变化,初始加载时它会调用数据源方法,用的是你全局数组里的默认值["2" , "2" , "3","4","5","6","7","8","9"]。等你滚动表格的时候,表格会重新请求数据,这时候才拿到了解析后的新数组,所以才会显示正确内容。
直接解决办法:更新数据后立即刷新表格
修改你的JSON解析代码,在赋值完全局数组之后,回到主线程调用tableView.reloadData()——记住,所有UI操作都必须在主线程执行,而网络请求/JSON解析一般是在后台线程跑的,所以一定要包在DispatchQueue.main.async里:
do { let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary if let parseJSON = json { let categoryList = parseJSON["categoryList"] as? [String: Any] // 用更安全的类型转换 if let goodTypeNames = categoryList?["goodTypeName"] as? [String] { Global.GlobalVariable.names = goodTypeNames print(Global.GlobalVariable.names) // 关键:回到主线程刷新表格 DispatchQueue.main.async { self.tableView.reloadData() } } } } catch { print("JSON解析出错啦:\(error)") }
我还帮你把强制解包as!改成了可选绑定,这样能避免因为JSON格式不对导致崩溃,代码更健壮。
额外优化建议(可选但推荐)
全局变量虽然好用,但长期来看不利于代码维护,建议把数据源数组移到你的UITableView所在的ViewController里,比如:
// 在你的ViewController里声明 var categoryNames: [String] = ["2" , "2" , "3","4","5","6","7","8","9"]
之后解析数据时直接更新这个本地数组,再刷新表格,逻辑会更清晰,也更容易追踪数据变化。
最后检查数据源方法
确保你的UITableView数据源方法是正确使用新数组的,比如:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 如果用全局数组就写Global.GlobalVariable.names.count,用本地数组就写categoryNames.count return Global.GlobalVariable.names.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "你的CellID", for: indexPath) cell.textLabel?.text = Global.GlobalVariable.names[indexPath.row] return cell }
这样改完之后,你就能看到表格在解析完数据后立即更新显示新内容啦!
内容的提问来源于stack exchange,提问作者Am1rFT
相关产品推荐
相关产品推荐

