You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:08:24