Leyendo la sección de Concurrencia de la Guía Swift, me encontré con:
Para crear una tarea no estructurada que se ejecute en el actor actual, llame al
Task.init(priority:operation:)
. Para crear una tarea no estructurada que no forme parte del actor actual, conocida más específicamente como tarea separada, llame al método de claseTask.detached(priority:operation:)
.
Está la frase "actor actual". Esto también se menciona en la documentación de Task.init
:
Ejecuta la operación de no lanzamiento dada de forma asincrónica como parte de una nueva tarea de nivel superior en nombre del actor actual.
Antes, creía haber entendido lo que significaba "actor actual":
MainActor
, ya que su ejecutor es la cola principal.actor
y no está nonisolated
, entonces su actor actual es ese actor. @SomeOtherActor func somethingElse() { DispatchQueue.main.async { // current actor is MainActor } } @MainActor class Foo: NSObject { func foo() { /* current actor is MainActor */ } } actor Bar { func foo() { /* current actor is Bar */ } }
Sin embargo, recientemente me di cuenta de que olvidé considerar una situación: ¿qué sucede en una cola global (o cualquier otra cola aleatoria)?
@SomeOtherActor func somethingElse() { DispatchQueue.global().async { // current actor is? } }
Cuando intenté acceder a una de las propiedades aisladas del actor de SomeOtherActor
en el cierre, recibí el mensaje:
La propiedad 'x' aislada del actor global 'SomeOtherActor' no se puede mutar desde un contexto no aislado
¿Es esa la forma en que Swift dice que no hay un actor actual? Si es así, ¿qué hará Task.init
? La documentación realmente no dice.
Idealmente, ¿hay alguna forma de imprimir programáticamente al actor actual?
Pensé que las propuestas de SE explicarían qué significa "actor actual". Ninguna de las propuestas de SE menciona la palabra "actor actual": SE-0306 , SE-0313 , SE-0316 , SE-0327 , SE-0344 .