使用dispatch_async和self

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

dispatch_async(dispatch_get_main_queue()) { self.hostViewController?.view.addSubview(self.commandField) } 

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

 Could not find member 'addSubview' 

我认为这是一个错误,还没有得到正确的实施,因为如果我把addSubview调用的dispatch_async块外,项目生成的罚款。 起初,我认为这可能与在这个街区捕捉self有关。 但是,插入[unowned self] in导致相同的错误,就像[weak self] in (在插入适当的! unwrap操作符之后)一样。

我怎样才能让dispatch_async块在Swift中工作,需要捕捉self

你应该把这个动作放在non-nullity上,而不是在你已经启动之后testing它:

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

你不应该打开一个可选的外部, if let ,或者先testing它。 这样做也应该解决你的弱自我问题。

dispatch_async语法已经改变了Swift 3:

 DispatchQueue.main.async { hostView.addSubview(self.commandField) }