在计算密集型任务中,我希望向用户展示活动指标。最好的方法是什么?
我的任务(当然是人为设计的)持续了几秒钟:
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()
}
但是活动指示器没有显示;用户界面被难以思考的任务所阻拦。
我尝试将startAnimating
放在主线程上:
DispatchQueue.main.async {
self.myActivity.startAnimating()
}
或将困难的任务放到自己的线程上:
DispatchQueue.global().async {
Thinker.sharedInstance.startThinking(howMany: 500000000)
}
以及我在Stack中遇到的各种其他组合。我在做什么错了?
答案 0 :(得分:0)
首先,我将呼叫移动到开始进行动画制作之前,将其移动到思想者呼叫之前,并在您不开始思考的情况下验证其是否有效。您还需要从主线程停止动画。
@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()