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

时间:2015-02-15 04:42:18

标签: ios swift uiactivityindicatorview

编辑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的建议并且它不起作用所以我想知道这是因为与我上次引用的代码之上和/或之下的代码有关 - 所以在下一个块中代码是他的变化和更多来自我正在做的事情(显然是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()”的函数可能需要几秒钟,所以我想在它处理过程中显示活动指示器。这是我的代码:

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

我很确定我的活动指示器设置正确,因为我通过使用start和stopAnimating()设置了“On”和“Off”按钮来测试它,并且它可以正常使用按钮。你看到的NSLogs被3秒“reset()”分开 - 只是我的活动指标从未显示过。

我的故事板中的活动指示器设置未选中“Animating”(因为如果我检查它是否从加载该视图控制器出现并且永远不会消失 - 即使我看到的教程说要检查以启用它)并选中“隐藏时隐藏”并选中“隐藏”。我也尝试将.hidden = false添加到上面的startanimiating中,但仍然没有出现。

1 个答案:

答案 0 :(得分:2)

该函数异步运行;您的应用程序不会停止并等待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()
})