gpt4 book ai didi

ios - 如何在漫长的过程中使用事件指示器?

转载 作者:可可西里 更新时间:2023-11-01 01:42:22 26 4
gpt4 key购买 nike

编辑 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 的建议,但它没有用,所以我想知道这是否是因为与我第一次引用的一小段代码上方和/或下方的代码有关 - 所以在下一个 block 中代码是他所做的更改和更多来 self 正在做的事情的上下文(显然是 UIAlertController 中的一个 Action ):

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()

我很确定我的 Activity Indicator 设置正确,因为我通过放置一个“On”和“Off”按钮以及 start 和 stopAnimating() 来测试它并且它与按钮一起工作正常。并且您看到的 NSLog 被“reset()”所需的 3 秒分隔 - 只是我的 Activity Indicator 从未显示。

我在 Storyboard中设置了事件指示器,但未选中“动画”(因为如果我检查它是否从该 View Controller 的加载中显示并且永远不会消失 - 即使我看到的教程说要检查以启用它) 并且我选中了“停止时隐藏”和“隐藏”。我也尝试将 .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()
})

关于ios - 如何在漫长的过程中使用事件指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com