Combine Swift

es Dec 13, 2022

Programación reactiva

“En informática, la programación reactiva es un paradigma de programación declarativa que se ocupa de los flujos de datos y la propagación del cambio.
Con este paradigma es posible expresar flujos de datos estáticos (por ejemplo, matrices) o dinámicos (por ejemplo, emisores de eventos) con facilidad, y también comunicar que existe una dependencia inferida dentro del modelo de ejecución asociado, lo que facilita la propagación automática de los datos modificados. fluir.”

La programación reactiva es una manera de hacer programación asincrónica. En la programación reactiva, todo puede ser un flujo de datos.

Con este tipo de programación se desacopla el código que se va a ejecutar y el hilo. Este enfoque es muy importante para algunas arquitecturas del lado del servidor que solo tienen un hilo para ejecutar el código como Node.js.

Dado que solo tiene un hilo para ejecutar el código, si se bloquea, todo el servidor estará en un estado detenido y no se podrán ejecutar más solicitudes.

Combine Framework

“Personalice el manejo de eventos asincrónicos combinando operadores de procesamiento de eventos”.

La programación con el marco Swift Combine es declarativa, reactiva y funcional. Implica encadenar funciones y pasar valores de uno a otro. Estos valores pueden representar muchos tipos de eventos asincrónicos. Esto crea corrientes de valores que fluyen desde la entrada hasta la salida.

Combine declara a los editores para exponer valores que pueden cambiar con el tiempo. Cualquier cosa que pueda suceder con el tiempo puede ser representada por un editor. Los suscriptores se utilizan para recibir los valores emitidos por los editores.

Publisher

Publisher envía secuencias de valores a lo largo del tiempo a uno o más suscriptores.

Subscriber

Subscriber recibe valores de un Publisher.

Just

Un publicador que emite una salida a cada suscriptor solo una vez y luego finaliza. Proporciona un valor único y luego termina automáticamente.

Combine tiene dos suscriptores integrados: assign y sink. Un publicador puede conectarse a ellos llamando a cualquiera de los dos en un publicador.

assign(to: on:)

Asigna la salida de un editor a una propiedad de un objeto.

sink(receiveCompletion:receiveValue:)

Un suscriptor puede adjuntarse a un editor usando .sink.

El primer cierre se ejecuta cuando recibe Subscribers.Completition, que es una enumeración que indica si el editor terminó normalmente o falló con un error.

El segundo cierre se ejecuta cuando recibe un elemento del editor.

Los suscriptores también se pueden cancelar en cualquier momento para evitar recibir eventos simplemente llamando a .cancel()

Subject

El Subject es un tipo especial de publisher que puede insertar valores, pasados desde el exterior, en la secuencia. Se utiliza para inyectar valores en una secuencia utilizando el método .send(:)

PassthroughSubject

Un subject que transmite elementos a los suscriptores descendentes.

PassthroughSubject proporciona una forma conveniente de adaptar el código imperativo existente al modelo Combine.

A diferencia de CurrentValueSubject, a PassthroughSubject no tiene un valor inicial o un búfer del elemento publicado más recientemente. A PassthroughSubject elimina valores si no hay suscriptores.

El output será:

Hello,
World!
finished

CurrentValueSubject

Un asunto que envuelve un valor único y publica un nuevo elemento cada vez que cambia el valor.

A diferencia PassthroughSubject, CurrentValueSubject mantiene un búfer del elemento publicado más recientemente.

El output sera:

1
2
2

receive(on:options:)

Especifica el planificador en el que recibir elementos del publicador. Establece el planificador de suscripción en toda la secuencia.

Operadores

Las extensiones en Publisher definen una amplia variedad de operadores que se pueden componer para crear sofisticadas cadenas de procesamiento de eventos. Cada operador devuelve un tipo que implementa el protocolo Publisher.

map(_:)

Se comporta de manera similar al mapa en Swift. Transforma todos los elementos del Publisher con un cierre determinado.

El output será:

10
20
30
40

replaceNil(with:)

Reemplaza elementos nulos en el flujo de Publisher con el elemento proporcionado.

filter(_:)

El filtro elimina todos los elementos que no coinciden con la condición del cierre proporcionado.

El output será:

2
4

removeDuplicates()

Publica solo elementos que no se repiten.

El output será:

1
2
3
4

Conclusión

Combine se ajusta mejor cuando tú deseas configurar algo que reacciona a un flujo de valores. Las interfaces de usuario encajan muy bien en este patrón. Pero Combine no se limita a las interfaces de usuario.

La aplicación de estos conceptos a un lenguaje fuertemente tipado como Swift es parte de lo que Apple ha creado en Combine. Combine extiende la programación funcional reactiva al incorporar el concepto de contrapresión. La contrapresión es la idea de que el suscriptor debe controlar cuánta información obtiene de una vez y necesita procesar.

Tags