【发布时间】:2022-02-13 19:55:00
【问题描述】:
我有一个添加了 refreshControl 的表,当我下拉刷新内容时,我重置了为表提供数据的数组,然后立即通过 API 调用请求新数据。
到目前为止,我一直使用完成处理程序和协议将数据放入表视图中,但由于网络调用和嵌套闭包金字塔所需的复杂性,我想将逻辑移动到异步/等待。
在 viewDidLoad 中填充视图工作正常,但使用 pullToRefresh 选择器时出现错误:
Thread 1: EXC_BAD_ACCESS (code=1, address=0xbcf917df8160)
实施:
override func viewDidLoad() {
super.viewDidLoad()
setupView()
setupTableView()
setupTableRefreshControl()
Task {
await getBalances() //async network call
myTable.reloadData()
}
}
func setupTableRefreshControl() {
myTable.refreshControl = UIRefreshControl()
myTable.refreshControl?.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
}
导致应用崩溃的代码:
@objc func didPullToRefresh() async {
balance.reset() // reset array to []
Task {
await getBalances() //async network call
myTable.reloadData()
}
}
【问题讨论】:
-
我怀疑
@objc目标/操作方法可以是异步的。 -
我现在才意识到同样的事情。如果你提交你的答案,我会接受它
-
@vadian,为什么没有记录?我想知道这是一个错误还是将要修复的东西?问题是,如果您尝试从非异步的操作处理程序调用异步函数,编译器似乎希望将 async 关键字添加到操作处理程序本身,如果在任何部分都没有办法,这是一个很大的限制调用异步函数的按钮响应。必须有某种方式来解耦事件。
-
@clearlight Target/action 属于 Objective-C(注意
@objc属性)并且 Objective-C 对 Swift 并发一无所知。
标签: ios async-await swift5 uirefreshcontrol swift5.5