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,或者先测试它.这样做也应该解决你自己的弱问题.
JAL*_*JAL 12
该dispatch_async语法已更改与斯威夫特3:
DispatchQueue.main.async {
hostView.addSubview(self.commandField)
}
Run Code Online (Sandbox Code Playgroud)