Preguntas
¿Qué es un AsyncStream y en qué se diferencia de un AsyncThrowingStream?
Un AsyncStream es un AsyncSequence que puede emitir eventos de progreso y fin con base en un AsyncStream.Continuation.
Es muy parecido a un Publisher de Combine, con la diferencia que solo admite un suscriptor.
AsyncThrowingStream es la versión que arroja error de AsyncStream.
¿Por qué podría querer reemplazar un closure de progreso/completación con un AsyncThrowingStream?
Facilita la integración del API de async/await en lugar de una integración basada en closures. Además, AsyncStream permite poder iterar con for try await en lugar de anidar closures, lo que hace el flujo más lineal y legible.
¿Qué sucede si no se llama a continuation.finish() al terminar un stream?
La implementación se va a quedar colgada sin terminar. El código que itera el stream con for try await nunca avanza más allá del loop porque el stream nunca emite el evento de terminación.
¿Qué son las buffer policies y cuándo tendría sentido usar cada una?
Las "buffer policies" define qué hacer con los valores emitidos cuando no hay ningún consjmidor leyendo aún. Es decir: regulan el buffer previo a la lecutra, no a la entrega en tiempo real. En el artículo se mencionan:
-
AsyncStream.Continuation.BufferingPolicy.unbounded: El suscriptor recibe todos los eventos pasados emitidos por elAsyncStreamantes de la suscripción. -
AsyncStream.Continuation.BufferingPolicy.bufferingOldest(_:): El suscriptor recibe los primeros (oldest)neventos emitidos por elAsyncStream. -
AsyncStream.Continuation.BufferingPolicy.bufferingNewest(_:): El suscriptor recibe los últimos (newest)
neventos emitidos por elAsyncStream. En el artículo ponen de ejemplo que al usarbufferingnewest(0), se ignoran todos los eventos pasados emitidos por elAsyncStream.
¿En qué se diferencia un AsyncStream de un publisher de Combine?
El Publisher de Combine puede tener varios suscriptores. El AsyncStream solo puede tener uno.
¿Cómo se usa el continuation para enviar valores, manejar errores y terminar el stream?
Sobre el continuation se pueden usar los siguientes métodos:
-
yield(with:): Para emitir un elemento de tipoResult<Element,Never> en unAsyncStream`. -
yield(with:): Para emitir un elemento de tipoResult<Element,Failure> en unAsyncThrowingStream`. -
finish(): Para cerrar el Stream sin emitir error. -
finish(throwing:): Para cerrar el Stream emitiendo un error -
onTermination: Suscribe un closure para ejecutar algún trabajo cuando termina el stream. Este sirve para hacer labores de limpieza o depuración.
¿Qué hace el callback onTermination y para qué casos de uso es útil?
Suscribe un closure para ejecutar algún trabajo cuando termina el stream. Este sirve para hacer labores de limpieza o depuración.
¿Cómo y cuándo se cancela un stream, y qué efecto tiene la cancelación?
Un Stream se cancela cuando el contexto asíncrono que lo envuelve es cancelado (e.g. Task.cancel()).
El stream se termina (no en error, ni en success), sino que se invoca onTermination con la causa (i.e. "termination reason: cancelled")
No hay forma de cancelar el stream explícitamente, solo de forma indirectamente a través del Task que lo envuelve.
¿Por qué no es seguro tener múltiples consumidores de un mismo AsyncStream?
Como solo puede tener un suscriptor, no se sabe a cuál le va a entregar el valor. Los valroes se reparten entre los consumidores en lugar de duplicarse - Cada valor lo recibe uno solo, de forma impredecible.
Top comments (0)