在segue到下一个视图控制器之前进行异步调用(Swift)
我有一堆视图控制器(嵌入式导航控制器),我需要在进入下一个屏幕之前进行一些异步调用。 问题是我需要在单击映射到segue的按钮时进行此调用,但由于异步调用尚未返回,因此将生成segue并显示下一个视图控制器。 在返回异步调用之前,人们如何做这种事情以防止视图控制器导航发生?
TL; DR您可以为UIButton
创建一个@IBAction
,并在函数内部进行异步调用,并使用dispatch_async(dispatch_get_main_queue()) {}
在completionHandler中手动启动segue。
要手动创建segue,只需按Ctrl +从UIViewController
拖动到下一个,如下图所示:
然后你会看到如下图所示选择segue的类型:
选择Show
类型后,您可以在左侧的视图层次结构中看到segue选择它来设置segue的标识符,如下图所示:
您可以使用函数performSegueWithIdentifier
手动启动segue
,您可以在Web中引用有关如何使用Interface Builder手动创建segue的大量教程。
一旦你创建了segue,就可以在任何你想要的地方调用它,在你的情况下,你将在异步调用的completionHandler中调用它,你需要使用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) } } }
我希望这可以帮助你。
听起来你正在寻找它同步运行; 因此,如果您在后台线程上使用Gack时调用dispatch_sync
而不是dispatch_async
,并且当您需要segue发生时,通过调用dispatch_sync(dispatch_get_main_queue(), ^{ // handle error or segue }
将事物放回到主线程上dispatch_sync(dispatch_get_main_queue(), ^{ // handle error or segue }