使用dispatch_async与self

Eph*_*era 42 grand-central-dispatch swift

在将Objective-C代码移植到Swift时,我遇到过几次这个问题.说我有以下代码:

dispatch_async(dispatch_get_main_queue()) {
    self.hostViewController?.view.addSubview(self.commandField)
}
Run Code Online (Sandbox Code Playgroud)

这将导致错误,强调整个dispatch_async通话,提供:

Could not find member 'addSubview'
Run Code Online (Sandbox Code Playgroud)

我认为这是一个尚未正确实现的错误,因为如果我将addSubview调用放在dispatch_async块外,项目构建正常.最初我认为它可能与self块中的捕获有关.但是,插入[unowned self] in结果会产生相同的错误[weak self] in(在!插入适当的展开操作符之后).

如何dispatch_async在Swift中获取需要捕获的块self

ilu*_*pra 65

您应该在非归零条件下关闭此操作,而不是在您已经启动它之后对其进行测试:

if let hostView = self.hostViewController?.view {
    DispatchQueue.main.async {
         hostView.addSubview(self.commandField)
    }
} else {
    // handle nil hostView 
}
Run Code Online (Sandbox Code Playgroud)

你永远不应该打开一个可选的外部if let,或者先测试它.这样做也应该解决你自己的弱问题.

  • 这是因为表达式`self.hostViewController?.view`返回一个类型为`NSView?`,*not*`NSView`的对象.始终必须检查可选链,并且必须提供或强制结果. (5认同)

JAL*_*JAL 12

dispatch_async语法已更改与斯威夫特3:

DispatchQueue.main.async { 
    hostView.addSubview(self.commandField)
}
Run Code Online (Sandbox Code Playgroud)