正确使用 Dispatch 在长任务期间显示 activity 指标
Proper use of Dispatch to show activity indicator during a long task
在计算密集型任务中,我希望向用户显示一个 activity 指标。最好的方法是什么?
我的任务(当然是人为的)持续几秒钟:
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()
}
但是 activity 指标没有出现; 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()
在计算密集型任务中,我希望向用户显示一个 activity 指标。最好的方法是什么?
我的任务(当然是人为的)持续几秒钟:
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()
}
但是 activity 指标没有出现; 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()