【问题标题】:How do I display an Activity Indicator Alert Controller while running a time-consuming function?如何在运行耗时功能时显示活动指示器警报控制器?
【发布时间】:2017-02-12 02:06:41
【问题描述】:

我有 Xcode 8.2、iOS 10、Swift 3。

在我的应用程序中,用户单击“开始处理”按钮会启动一项耗时的功能。我希望有一个包含活动指示器的警报窗口。但是,我看到的所有教程都只是向我展示了如何启动和停止它,而不是如何将它与函数的运行异步配对。

我的代码是这样的:

func doProcessing() {
    for (...) {
        timeConsumingFunction()
    }
}

// This function displays a setup which allows the user to manually kick off the time consuming processing.
func displaySetupScreen() {

    let alertController = UIAlertController(title: "Settings", message: "Please enter some settings.", preferredStyle: .alert)

    // ask for certain settings, blah blah.

    let actionProcess = UIAlertAction(title: "Process", style: .default) { (action:UIAlertAction) in
        //This is called when the user presses the "Process" button.
        let textUser = alertController.textFields![0] as UITextField;

        self.doProcessing()
        // once this function kicks off, I'd like there to be an activity indicator popup which disappears once the function is done running.
    }
    self.present(alertController, animated: true, completion: nil)


}

// this displays the actual activity indicator ... but doesn't work
func displayActivityIndicator() {
    // show the alert window box
    let alertController = UIAlertController(title: "Processing", message: "Please wait while the photos are being processed.", preferredStyle: .alert)

    let activityIndicator : UIActivityIndicatorView = UIActivityIndicatorView()
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
    activityIndicator.startAnimating()

    self.present(alertController, animated: true, completion: nil)
}

基本上,我不知道如何在正确的时间启动和停止活动指示器,以及如何在此期间显示警报控制器。

感谢您的帮助。

【问题讨论】:

标签: ios swift swift3 uiactivityindicatorview


【解决方案1】:

正如 ebby94 在他的评论中发布的链接所说,你真的应该避免在主线程上运行耗时的任务。它会冻结 UI,如果您花费的时间过长,系统 Springboard 最终将终止您的应用程序。

你真的应该在后台任务上运行你的长时间运行的任务。如果没有更多信息,我真的无法详细解释。

如果您决定在主线程上运行耗时的任务,那么您需要启动活动指示器旋转,然后返回并给事件循环时间以在任务开始之前实际启动动画。像这样的:

activityIndicator.startAnimating()
DispatchQueue.main.async {
  //Put your long-running code here
  activityIndicator.stopAnimating()
}

Dispatch 中的代码仍将在主线程上运行,但首先运行循环将有机会启动活动指示器。

【讨论】:

  • 谢谢。在 Swift 3 中,它应该是 DispatchQueue.main.async 但这个答案对我有用。
  • 抱歉打错字了。我是凭记忆打出来的,很明显弄错了。很高兴您能够纠正错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多