如何在漫长的过程中使用 Activity 指标?

How do I use the Activity Indicator during a long process?

编辑 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]

编辑 - 我正在尝试 AstroCB 的建议,但它没有用,所以我想知道这是否是因为与上面 and/or 上面的代码有关,下面是我第一次引用的一小段代码 - 所以在下一个代码块中是他的更改以及我正在做的更多上下文(显然是 UIAlertController 中的一个操作):

alert.addAction(UIAlertAction(title: "Start Over", style: UIAlertActionStyle.Destructive, handler:  { action in
        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()
        })
        setPlace(0, 0, "done")
        save()
        instructing = true
        continuing = false

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

...

我有一个名为 "reset()" 的函数,它可能需要几秒钟,所以我想在它处理期间显示 activity 指示器。这是我的代码:

NSLog("before calling reset")
self.activityIndicator.startAnimating()
reset()
NSLog("after calling reset")
self.activityIndicator.stopAnimating()

我很确定我的 Activity 指示器设置正确,因为我通过将 "On" 和 "Off" 按钮与 start 和 stopAnimating() 一起测试它并且它有效很好的按钮。你看到的 NSLogs 被 "reset()" 的 3 秒隔开 - 只是我的 Activity 指示器从未显示。

我在故事板中设置了 activity 指示器,但 "Animating" 未选中(因为如果我检查它是否从该视图控制器的加载中显示出来并且永远不会消失 - 即使教程我看到有人说要检查以启用它)并且我检查了 "Hides When Stopped" 和 "Hidden"。我也尝试将 .hidden = false 添加到上面的 startanimiating 中,但仍然没有出现。

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

因此,您实际上是在打开指示器动画,然后立即将其关闭。要解决这个问题,您必须 告诉应用程序 在停止动画之前等待功能完成,您可以使用 dispatch_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()
})