在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 }