在将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 ?
语言版本3所做的更改之后,Swift中dispatch_once的新语法是什么? 旧版本如下。 var token: dispatch_once_t = 0 func test() { dispatch_once(&token) { } } 这些是对libdispatch所做的更改 。
我需要在主队列上同步分派一个块。 我不知道我目前是在主线程还是不在线。 天真的解决scheme如下所示: dispatch_sync(dispatch_get_main_queue(), block); 但是,如果我目前在主队列中运行一个块,这个调用会造成死锁。 (同步调度等待块完成,但块甚至不开始运行,因为我们正在等待当前的块完成。) 明显的下一步是检查当前队列: if (dispatch_get_current_queue() == dispatch_get_main_queue()) { block(); } else { dispatch_sync(dispatch_get_main_queue(), block); } 这工作,但它是丑陋的。 在我至less把它隐藏在一些自定义函数之前,是不是有更好的解决这个问题的办法? 我强调,我不能asynchronous调度块 – 应用程序处于asynchronous调度块“执行太迟”的情况。