Preguntas
¿Qué es un AsyncSequence y en qué se diferencia de un Sequence normal?
AsyncSequence es un tipo de dato que provee acceso secuencial e iterativo a una colección de forma asíncrona.
AsyncSequence es un hermano de Sequence que prácticamente puede hacer todo lo que hace Sequence (como contains(_:), map(_:)) con la diferencia que los datos se recorren de forma asíncrona.
¿Qué rol cumplen AsyncIterator y el método next() dentro de una secuencia asíncrona?
Un tipo de dato que conforme el protocolo AsyncSequence debe definir el método makeAsyncIterator() que devuelve una instancia que conforme el protocolo AsyncIteratorProtocol.
Un AsyncIterator es como un IteratorProtocol con la diferencia que debe recorrer una colección asíncrona a través del método next() async que puede tener puntos de suspensión y, retorna el siguiente valor de la colección o nil si ya terminó el trabajo.
¿Cómo se indica el fin de la iteración en un AsyncSequence personalizado?
Se indica el fin de una iteración devolviendo nil. Esto puede ocurrir por dos razones:
- se alcanzó el límite configurado
- la tarea fue cancelada (
Task.isCancelled).
¿Por qué se recomienda usar AsyncStream en lugar de implementar AsyncSequence directamente?
AsyncStream es más conveniente de configurar que AsyncSequence, porque al usar este último se debe un AsyncIterator y manejar su estado.
¿Qué operadores de Sequence están disponibles también para secuencias asíncronas?
Métodos como:
-
contains(where:)- Tener cuidado que métodos como este esperan a que la secuencia asíncrona termine de emitir elementos y se puede quedar esperando indefinidamente. map(_:)filter(_:)
Identifica cómo el protocolo AsyncSequence define el acceso a valores sin generarlos por sí mismo.
AsyncSequence se encarga de la construcción del AsyncIteratorProtocol, quien técnicamente es el encargado de generar los elementos en el método next() async.
Analiza cómo la cancelación con Task.isCancelled interactúa con el ciclo de vida de la secuencia.
Entro del contexto de next() async es de vital importancia verificar que la tarea no haya sido cancelada con Task.isCancelled (sin esta verificación, la secuencia seguiría emitiendo valores a pesar de que la tarea hubiera sido cancelada). Si lo fue, entonces retornar nil.
Top comments (0)