正确使用调度在长任务期间显示活动指示器



在计算密集型任务期间,我希望向用户展示一个活动指标。最好的方法是什么?

我的任务(当然是人为的(持续几秒钟:

func startThinking(howMany: Int) {
    for i in 0...howMany {
        let p:Double = Double(i)
        let _ = p / Double.pi
    }
    delegate?.finishedThinking()
}

这在点击按钮时调用:

@IBAction func startTap(_ sender: Any) {
    Thinker.sharedInstance.startThinking(howMany: 500000000)
    myActivity.startAnimating()
}

并在思考任务完成后停止:

func finishedThinking() {
    print ("finished thinking")
    myActivity.stopAnimating()
}

但是活动指示器没有显示;UI被困难的思考任务所阻止。

我尝试将startAnimating放在主线程上:

DispatchQueue.main.async {
    self.myActivity.startAnimating()
}

或者将困难的任务放在自己的线程上:

DispatchQueue.global().async {
    Thinker.sharedInstance.startThinking(howMany: 500000000)
}

以及我在 Stack 中遇到的各种其他组合。我做错了什么?

首先,我会将开始动画的调用移动到思想家调用之前,并在您不开始思考时验证它是否有效。您还需要从主线程停止动画。

@IBAction func startTap(_ sender: Any) {
    myActivity.startAnimating()
    DispatchQueue.global(qos: .userInitiated).async {
        Thinker.sharedInstance.startThinking(howMany: 500000000)
    }
}
func finishedThinking() {
    DispatchQueue.main.async {
        myActivity.stopAnimating()
    }
}

我调整了一些东西:

  • .startAnimating()呼叫移至"第一个"。它已经在主线程上,因为它是从接口调用的
  • qos指定为.userInitiated
  • 在主线程上运行.stopAnimating()

相关内容

  • 没有找到相关文章

最新更新