首页 > 解决方案 > Swift 初始化程序调用 Dispatch Queue 异步

问题描述

从 Swift 对象初始化程序中调用 async 是错误的,例如这个

let serialQueue = DispatchQueue(label: "com.myApp.SerialQueue")
private let property1:Int?

public override init()
{
    super.init()
    /* Initialize properties */
    setupProperties()
    serialQueue.async { [unowned self] in
       self.nonBlockingSetup()
    }
}
private func setupProperties() {
    self.property1 = 1
}
private func nonBlockingSetup() {
    //Some non-blocking code that shouldn't run on main thread
}

有人说在 init 返回之前异步调用是有问题的。需要知道 Swift 语言是怎么说的。

编辑:如果我修改代码如下有什么区别:

public override init()
{
    super.init()
    /* Initialize properties */
    setupProperties()
    callNonBlockingCodeAsync()
}

private func callNonBlockingCodeAsync() {
   serialQueue.async { [unowned self] in
       self.nonBlockingSetup()
    }
}

标签: iosswiftswift4

解决方案


为了回答你的问题,我尝试了一个简单的例子。

在此处输入图像描述

Errors非常不言自明,在初始化过程dispatchQueue中,在实际初始化之前捕获自我引用。

在使用它之前,您concurrency problem遇到了需要初始化对象的地方。

dispatchQueue使用闭包来提供DispatchWorkItem,并且如您所知,闭包捕获围绕其范围的值。

更新

一种解决方法是为您的属性提供默认值,但我不确定这是否会对您有所帮助。


推荐阅读