我尝试熟悉 Swift 并发,尤其是 MainActor。
我为自己制作了这个演示课程:
@MainActor
class ThreadsDemo {
let range1000 = 0.. < 1000
var randomNumber = 0
init() {
randomNumber = Int.random(in: range1000)
}
func modifyRandomNumber() async {
print("2. isMain: \(Thread.isMainThread)")
let newRandomNumber = Int.random(in: range1000)
print("Generated random-number -> \(newRandomNumber)")
Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) {
_ in
print("4. isMain (within wait): \(Thread.isMainThread)")
}
print("5. isMain: \(Thread.isMainThread)")
randomNumber = newRandomNumber
}
}
调用ThreadDemo方法:
.task {
print("1. isMain: \(Thread.isMainThread)")
print("Initial random-number -> \(threadsDemo.randomNumber)")
await threadsDemo.modifyRandomNumber()
print("Modified random-number -> \(threadsDemo.randomNumber)")
print("6. isMain: \(Thread.isMainThread)")
}
结果:
1. isMain: true
Initial random-number -> 455
2. isMain: true
Generated random-number -> 578
5. isMain: true
Modified random-number -> 578
6. isMain: true
4. isMain (within wait): true
显然,所有东西都在主线程上运行,甚至是预定计时器内的块。
我很困惑,因为我认为它会使用后台线程来防止 UI 冻结和无响应。
如果它无论如何都在主线程上运行所有内容,那么使用任务的目的是什么?
但我真正想弄清楚的是:
@MainActor 注释是否会导致在主线程上运行所有内容(所有可执行代码)还是只会导致始终在主线程上对状态(分配等)进行更改?