使用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) }