Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
406 views
in Technique[技术] by (71.8m points)

grand central dispatch - Using dispatch_async with self

I have run into this problem a few times while porting Objective-C code to Swift. Say I have the following code:

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

This will result in an error, underlining the entire dispatch_async call, offering:

Could not find member 'addSubview'

I assume this is an error that has not yet been properly implemented because if I put the addSubview call outside the dispatch_async block, the project builds fine. Initially I assumed it may have something to do with capturing self in the block. However, inserting [unowned self] in results in the same error, as does [weak self] in (after the appropriate ! unwrap operators have been inserted).

How can I get dispatch_async blocks to work in Swift that need to capture self?

question from:https://stackoverflow.com/questions/24092786/using-dispatch-async-with-self

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You should condition spinning off this action on the non-nullity, not test for it after you've already initiated it:

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

You should never unwrap an optional outside of an if let, or testing it first. Doing this should also resolve yer weak self issue.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...