Ios 如何在漫长的过程中使用活动指示器?

Ios 如何在漫长的过程中使用活动指示器?,ios,swift,uiactivityindicatorview,Ios,Swift,Uiactivityindicatorview,编辑2-好的,我想出了一种方法(不确定这是否是最好的方法),但这种方法对我来说很有效,它使用了AstroCB写的东西和其他一些东西-也许我不得不这样做,因为它已经在UIAlert的闭包中,主线程不是reset()或类似的东西,不确定-但无论如何-这似乎有效: self.toggleBurgerMenu(self) var alert = UIAlertController(title: "Are you sure?", message: "Starting over will resto

编辑2-好的,我想出了一种方法(不确定这是否是最好的方法),但这种方法对我来说很有效,它使用了AstroCB写的东西和其他一些东西-也许我不得不这样做,因为它已经在UIAlert的闭包中,主线程不是reset()或类似的东西,不确定-但无论如何-这似乎有效:

self.toggleBurgerMenu(self)
    var alert = UIAlertController(title: "Are you sure?", message: "Starting over will restore all previously discarded cards and return you to the start of 'Study Phase'!", preferredStyle: UIAlertControllerStyle.Alert)

    alert.addAction(UIAlertAction(title: "Start Over", style: UIAlertActionStyle.Destructive, handler:  { action in

        dispatch_async(dispatch_get_main_queue(), {
            NSLog("before calling reset")
            self.activityIndicator.startAnimating()
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
                reset()
                dispatch_async(dispatch_get_main_queue(), {
                    NSLog("after calling reset")
                    self.activityIndicator.stopAnimating()
                    setPlace(0, 0, "done")
                    save()
                    instructing = true
                    continuing = false

                    self.performSegueWithIdentifier("studyViewToStartSegue", sender: nil)
                })

            })

        })

    }))
[编辑2结束-谢谢你]

编辑-我正在尝试AstroCB的建议,但它不起作用,所以我想知道这是否是因为与我第一次引用的代码上面和/或下面的代码有关-因此在下一段代码中是他的更改,以及与我正在做的内容(显然是UIAlertController中的一个操作)有关:

我有一个名为“reset()”的函数,它可能需要几秒钟的时间,因此我希望在活动指示器执行过程中显示它。这是我的密码:

NSLog("before calling reset")
self.activityIndicator.startAnimating()
reset()
NSLog("after calling reset")
self.activityIndicator.stopAnimating()
我非常确定我的活动指示器设置正确,因为我通过使用start and stop animating()设置一个“开”和“关”按钮对其进行了测试,并且它与这些按钮配合良好。您看到的NSLogs之间用3秒的“reset()”时间分隔,只是我的活动指示器从未显示


我在我的故事板中设置了“动画”未选中的活动指示器(因为如果我检查它是否在加载视图控制器时显示并且从未消失-即使我看到的教程说要检查以启用它),并且我选中了“停止时隐藏”和“隐藏”复选框。我还尝试将.hidden=false添加到上面的startanimiating中,但仍然没有显示出来。

该函数正在异步运行;在继续编写代码之前,您的应用程序不会停止并等待
reset()
完成(即使这是您实际编写代码时最直观的思考方式)

正因为如此,您实际上是在打开指示器动画,然后立即将其关闭。要解决这个问题,您必须告诉应用程序在停止动画之前等待函数完成,您可以使用
dispatch\u async

NSLog("before calling reset")
self.activityIndicator.startAnimating()
reset()
dispatch_async(dispatch_get_main_queue(), { // Will wait until reset() has finished
    NSLog("after calling reset")
    self.activityIndicator.stopAnimating()
})

它不会等待您的函数完成,所以它会立即显示和隐藏它。是什么让NSLog等待?我怎样才能用活动指示器做到这一点?好的,我正在尝试这一点,但遇到了一些问题-也许应该向您展示更多关于这一点的代码:我发布了我如何尝试使用您的代码-它所做的是像正常情况一样冻结3秒钟,但现在我看到了一瞬间指示器,就在它执行您可以在我的编辑中看到的顺序之前-它包含了我所做的更多上下文-也许是我在那里做错了什么?@TommyDraughn,这很奇怪;不过,我很高兴你找到了答案。
NSLog("before calling reset")
self.activityIndicator.startAnimating()
reset()
dispatch_async(dispatch_get_main_queue(), { // Will wait until reset() has finished
    NSLog("after calling reset")
    self.activityIndicator.stopAnimating()
})