Converter
是一个在后台做一些工作的对象。在 UI 上有一个按钮,允许用户停止Converter
操作。该对象最多使用 5 个线程。为了增加/减少线程数,我使用了 Actor
,它也用于标记 isRunning
属性。骨架是这样的。
fileprivate let MAX_THREADS = 5
actor ConverterData {
var threads: Int = 0
var isRunning: Bool = false
func incThreads() {
threads += 1
}
fun decThreads() {
threads -= 1
}
func setIsRunning(_ flag: Bool) {
isRunning = flag
}
}
class Converter {
private var converterData = ConverterData()
func start() {
Task {
await converterData.setIsRunning(true)
while await converterData.isRunning { // here always true
if await converterData.threads < MAX_THREADS {
await converterData.incThreads() // threads increase and the new number is seen by this if
// Create a new task
...
}
try? await Task.sleep(nanoseconds: 1000000000)
}
}
}
func stop() {
Task {
await converterData.setIsRunning(false)
// This change is seen here, in this task, but not in the previous task, inside the while.
print(await converterData.isRunning) // correct: false
}
}
}
如代码所示,使用注释,问题似乎如下:当我从
Task
更改actor属性时,其他任务看不到更改,但仍然只看到自己的更改。
也许我错过了演员背后的真正概念?