在segue到下一个视图控制器之前进行异步调用(Swift)

u84*_*six 7 ios segue swift

我有一堆视图控制器(嵌入式导航控制器),我需要在进入下一个屏幕之前进行一些异步调用.问题是我需要在单击映射到segue的按钮时进行此调用,但由于异步调用尚未返回,因此将生成segue并显示下一个视图控制器.在返回异步调用之前,人们如何做这种事情以防止视图控制器导航发生?

Vic*_*ler 6

TL; DR您可以@IBActionUIButton函数内部和内部创建一个异步调用,并使用完成在RunningHandler中手动启动segue dispatch_async(dispatch_get_main_queue()) {}.

要创建手动赛格瑞刚刚Ctrl+ DragUIViewController到下一个像下面的图片:

在此输入图像描述

然后你会看到如下图所示选择segue的类型:

在此输入图像描述

选择Show类型后,您可以在左侧的视图层次结构中看到segue,选择它来设置segue的标识符,如下图所示:

在此输入图像描述 您可以segue使用该函数手动启动问题performSegueWithIdentifier,您可以在Web中引用以查找有关如何使用Interface Builder手动创建segue的许多教程.

一旦你创建了segue,就可以在任何你想要的地方调用它,在你的情况下,你将在一个异步调用的completionHandler中调用它,你需要使用dispatch_async(dispatch_get_main_queue()) {}Grand Central Dispatch 的功能放入主线程中.

像这样的代码:

 @IBAction func buttonTapped(sender: AnyObject) {
    asyncFunction() {
        dispatch_async(dispatch_get_main_queue()) {
            self.performSegueWithIdentifier("someID", sender: sender)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,在Swift 3中,语法已更改:

@IBAction func buttonTapped(_ sender: AnyObject) {
    asyncFunction() {
        DispatchQueue.main.async {
            self.performSegueWithIdentifier("someID", sender: sender)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助你.

  • 手动制作segue的方法不是从'UIButton`按Ctrl + Drag到下一个ViewController,就像@dan说你需要在两个`UIViewController`之间制作segue只需按Ctrl + Drag从第一个到第二个,从'UIBUtton`你需要它只是一个`@ IBAction` (2认同)