Tento me familiarizar com a simultaneidade do Swift, especialmente com o MainActor.
Eu criei para mim esta classe de demonstração :
@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
}
}
Invocando o método 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)")
}
Resultado:
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
Obviamente executa tudo no thread principal, até mesmo o bloco dentro do temporizador agendado.
Estou confuso, porque pensei que ele usaria threads em segundo plano para evitar que a interface do usuário travasse e parasse de responder.
Se ele executa tudo no thread principal de qualquer maneira, então qual é o propósito de usar tarefas?
Mas o que eu realmente tentei descobrir:
A anotação @MainActor resulta na execução de tudo no thread principal (todo o código executável) ou resulta apenas em fazer alterações no estado (atribuições, etc.), sempre no thread principal?