我有一堆视图控制器(嵌入式导航控制器),我需要在进入下一个屏幕之前进行一些异步调用。问题是我需要在单击映射到segue的按钮时进行此调用,但由于异步调用尚未返回,因此将生成segue并显示下一个视图控制器。人们如何做这种事情来防止在返回异步调用之前发生视图控制器导航?
答案 0 :(得分:5)
TL; DR 您可以为@IBAction
创建UIButton
,并在函数内部进行异步调用,并在 completionHandler中手动启动segue 使用dispatch_async(dispatch_get_main_queue()) {}
。
要手动创建你的segue,只需 Ctrl + 将从UIViewController
拖动到下一张,如下图所示:
然后你会看到如下图所示选择segue的类型:
选择Show
类型后,您可以在左侧的视图层次结构中看到segue选择它来设置segue的标识符,如下图所示:
您可以使用函数segue
手动启动performSegueWithIdentifier
来解决问题,您可以在Web中引用有关如何使用Interface Builder手动创建segue的大量教程。
一旦你创建了segue,你可以在任何你想要的地方调用它,在你的情况下,你将在一个异步调用的 completionHandler 中调用它,你需要在主线程中输入Grand Central Dispatch的dispatch_async(dispatch_get_main_queue()) {}
功能。
像这样的代码:
@IBAction func buttonTapped(sender: AnyObject) {
asyncFunction() {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("someID", sender: sender)
}
}
}
修改强>: 请注意,在Swift 3中,语法已更改:
@IBAction func buttonTapped(_ sender: AnyObject) {
asyncFunction() {
DispatchQueue.main.async {
self.performSegueWithIdentifier("someID", sender: sender)
}
}
}
我希望这会对你有所帮助。
答案 1 :(得分:-4)
听起来你正在寻找它同步运行;因此,如果您在后台线程中使用重要工具时使用GCD调用dispatch_sync
而不是dispatch_async
,并且当您需要发生segue时,请通过调用{将问题重新置于主线程上{1}}