IOS:替代闭包样式在 UI 线程中执行代码

问题描述 投票:0回答:1

从后台线程,当UI需要更新时,需要使用async(execute:)函数发布到DispatchQueue.main,如下所示:

static func executeInUIThread(_ uiThreadFunc: @escaping (Any?) -> Void, _ parms: Any?) {
  DispatchQueue.main.async {
    // Update UI 
    uiThreadFunc(parms)
  }
}

可以在闭包内访问

uiThreadFunc
parms
,因为闭包从其“周围上下文”捕获变量

但是可以说,我不喜欢 lambda 风格(在 swift 中称为闭包)编程。我怎样才能在不关闭的情况下做到这一点?

我尝试了以下方法:

static func executeInUIThread(_ uiThreadFunc: @escaping (Any?) -> Void, _ parms: Any?) {
  let workItem = DispatchWorkItem(block: EventLoopMgr.InternalExecuteInUIThread)

  DispatchQueue.main.async(execute: workItem)
}

private static func InternalExecuteInUIThread() {
  // How to execute the uiThreadfunc? This block doesn't take any parameters.
}

它不起作用,因为初始化 DispatchWorkItem 时的block不带任何参数。因此,我无法将

uiThreadFunc
parms
传递到此块。

我可以将

uiThreadFunc
parms
存储为静态变量,但随后需要使其支持多线程。

有没有更简单的方法可以使用 DispatchQueue.main 在 UIThread 中执行但不使用闭包?

ios swift ui-thread
1个回答
0
投票

这对你有帮助吗?

test
来触发它,
updateView
uiThreadFunc

的一个示例
func test() {
    let aFunc = #selector(updateView)
    executeInUIThread(uiThreadFunc: aFunc, "xxx")
}

func executeInUIThread(uiThreadFunc: Selector, _ parms: Any?) {
    performSelector(onMainThread: uiThreadFunc, with: "bbb", waitUntilDone: false)
}

@objc func updateView(param: String) {
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.