【问题标题】:Swift 5.5: Async @objc didPullToRefresh selector crashes app with error EXC_BAD_ACCESSSwift 5.5:异步 @objc didPullToRefresh 选择器使应用程序崩溃,并出现错误 EXC_BAD_ACCESS
【发布时间】: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


【解决方案1】:

我意识到 didPullToRefresh 不需要标记为异步。从函数签名中删除“异步”可以解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多