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

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

可以访问闭合内部的uiThreadFuncparms,因为closures capture variables from their 'surrounding context'.

但是,我不喜欢Swift风格(Swift中称为闭包)的编程.我如何才能做到这一点没有关闭?

我try 了以下几点:

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不带任何参数.因此,我不能通过uiThreadFuncparms到这个街区.

我可以将uiThreadFuncparms存储为静态变量,但需要使其成为多线程友好的.

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

推荐答案

在我正在进行的项目中,按照惯例,函数中间不会有匿名代码块.它没有描绘出执行死刑的自然流程

好的,所以你可以把这not个匿名:

// I made this generic for you :)
func executeInUIThread<T>(_ uiThreadFunc: @escaping (T) -> Void, _ parms: T) {
    func helper() {
        uiThreadFunc(parms)
    }
    DispatchQueue.main.async(execute: helper)
}

在这里,我为将在主队列上运行的代码块命名为helper.

从技术上讲,根据Swift Guide,局部函数仍然被视为闭包,但如果您想要避免的只是一个"匿名"代码块,那么使用局部函数绝对可以做到这一点.

如果局部函数的噪声太大,可以像这样将其移出executeInUIThread:

func partiallyApply<T>(_ arg: T, to function: (T) -> Void) -> () -> Void {
    func helper() { function(arg) }
    return helper
}

然后,您只需执行以下操作:

DispatchQueue.main.async(execute: partiallyApply(parms, to: uiThreadFunc))

可以说更具可读性.你

Ios相关问答推荐

如何在将EXPO更新到50.0后修复react 本机错误

阿拉伯文变音符号(Harakat)在文本对齐的UILabel中未对齐

验证开发人员应用程序证书是否已在您的设备上验证

在相机动作之前快速防止场景视点重置

如何使用Swift以编程方式更改SVG文件中某些元素的 colored颜色

执行devicectl:ProcessException时出错:进程异常退出:错误:命令超时超过5.0秒

当应用程序被杀死时是否还能获取位置?

仅更改 AttributedString 的字符串(例如 UIButton 配置 attributeTitle)

如何在SwiftUI中实现淡入淡出加粘标题屏幕效果

DllImport with .a file for iOS in MAUI

使用 SceneKit 从 CapturedRoom.walls 重新创建 RoomPlan

SwiftUI DatePicker 格式在每个设备上都不一样,如何让它总是显示相同的 Select 版本?

SwiftUI - 使用切换switch 切换键盘类型(默认/数字)?

如何识别 SwiftUI 中点击的按钮 ID 以使该按钮动画化?

UIImageView 使用 CGAffineTransform 错误旋转

在 tableview 中下载图像缩略图时如何提高滚动性能

如何告诉 SwiftUI 视图绑定到嵌套的 ObservableObjects

何时需要将应用程序源包含在测试目标中?

如何找出用于构建 *.ipa 文件的配置文件?

如何找到 UILabel 的实际行数?