从后台线程,当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 中执行但不使用闭包?
这对你有帮助吗?
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) {
// ...
}