Swift 4中何时调用数组排序函数以刷新TableView?
解决数组排序无效的最佳时机问题
嘿,这个问题我太熟了!你遇到的核心问题是API请求是异步操作——viewDidLoad或viewDidAppear执行的时候,你的API请求还没返回数据,myArray自然是空的,排序操作当然起不了作用。
要解决这个问题,关键是等API数据完全填充到数组之后,再调用排序函数,具体有几种常见的实现方式:
1. 在API请求的完成闭包中调用排序
这是最直接的方案,不管你用传统的URLSession还是第三方网络库,都可以在数据解析完成、赋值给myArray之后立刻调用sort()。注意一定要切回主线程更新UI,因为tableView.reloadData()是UI操作。
举个例子:
func fetchDataFromAPI() { let apiURL = URL(string: "你的API地址")! URLSession.shared.dataTask(with: apiURL) { data, response, error in guard let data = data, error == nil else { print("API请求出错:\(error?.localizedDescription ?? "未知错误")") return } // 解析数据到你的模型数组(假设你的模型是YourModel) do { let parsedArray = try JSONDecoder().decode([YourModel].self, from: data) // 切回主线程更新UI和数组 DispatchQueue.main.async { self.myArray = parsedArray self.sort() // 这里才是调用排序的正确时机! } } catch { print("数据解析失败:\(error.localizedDescription)") } }.resume() }
然后你只需要在viewDidLoad里调用fetchDataFromAPI()就行,不用在生命周期方法里直接调用sort()。
2. 用Async/Await(iOS 15+)的现代写法
如果你的项目支持iOS 15及以上,用async/await会让代码更简洁,同样是在获取到数据之后调用排序:
func fetchData() async { let apiURL = URL(string: "你的API地址")! do { let (data, _) = try await URLSession.shared.data(from: apiURL) let parsedArray = try JSONDecoder().decode([YourModel].self, from: data) // 切回主线程更新UI DispatchQueue.main.async { self.myArray = parsedArray self.sort() } } catch { print("请求或解析失败:\(error.localizedDescription)") } }
然后在viewDidLoad里通过Task调用这个异步函数:
override func viewDidLoad() { super.viewDidLoad() Task { await fetchData() } }
3. 额外提醒:避免重复请求和排序
如果你的viewDidAppear会被多次触发(比如从其他页面返回),记得加个判断,避免重复请求数据和排序:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if myArray.isEmpty { fetchDataFromAPI() // 只有数组为空时才请求数据 } }
总结一下:永远不要依赖ViewController的生命周期方法来触发依赖异步数据的操作,正确的时机是在异步任务完成(数据填充完毕)之后,再执行排序和刷新表格的操作。
内容的提问来源于stack exchange,提问作者Maruta
相关产品推荐
相关产品推荐

