Aprende a usar el operador retry del framework Combine de Apple
Aprende a usar el operador retry del framework Combine de Apple

Operador Combine: retry

retry es un operador en Combine que nos permite recuperarnos tras errores lanzados en nuestro Publisher. El operador retry tiene un parámetro de entrada indicando el número de veces que nos queremos recuperar al enviar failures en nuestro Publisher.

SwiftBeta

Tabla de contenido


👇 SÍGUEME PARA APRENDER SWIFTUI, SWIFT, XCODE, etc 👇
🤩 ¡Sígueme en Twitter!
▶️ ¡Suscríbete al canal!
📙 COMPRAR EL LIBRO DE SWIFT ⭐️
Operador retry en Combine

Hoy en SwiftBeta vamos a ver otro operador en Combine llamado retry. Este operador nos permite recuperarnos cuando enviamos un error a través de nuestro Publisher, pero ¿qué significa que nos podemos recuperar? Al enviar un error a través de la pipeline, impedimos que se puedan seguir enviando valores, pero con el operador retry podemos recuperarnos y seguir enviando valores.

Operador retry en Combine

En el ejemplo práctico de hoy vamos a usar el mismo código que vimos en el Playground del tryMap. Vamos a copiar y pegar el código del Playground, si no has visto el video te recomiendo que eches un vistazo, es un video corto pero muy útil.

Una vez tenemos el código vamos a compilar. Aquí vemos que nuestro Publisher envía el valor 35 y a continuación obtenemos un error. Este error es debido a que estamos intentando transformar la String "SwiftBeta" a un Int, esto da un error (ya que la palabra SwiftBeta no se puede representar con un número). Este error viaja por nuestra pipeline y llega al Suscriber. Podemos observar que nuestro Publisher envía otro valor 32 pero no se envía. Ya es demasiado tarde, al enviar un error, un failure, nuestra pipeline para de enviar valores, por lo tanto el Subscriber nunca los recibirá. Es aquí donde entra en juego el operador retry.

Con el operador retry nos podemos recuperar de los errores que viajan en nuestro Stream. Vamos a indicar que nos queremos recuperar aunque enviemos un error. A continuación añadimos el operador retry. Al hacerlo podremos recibir el valor 32.

stringPublisher
     .tryMap { try mapStringToInt(with: $0) }
     .retry(1)
     .sink(receiveCompletion: { finished in
         print("Completed \(finished)")
     }, receiveValue: { integer in
         print("Value \(integer)")
     })
Operador retry nos permite recuperarnos de errores que se lanzan en nuestro Publisher

Al usar el operador retry vemos que espera un parámetro de entrada. Este parámetro es el número de veces que nos podemos recuperar al recibir errores en nuestra pipeline. En este caso añadimos 1 ya que sabemos que solo vamos a recibir un error. Vamos a compilar para ver el resultado que obtenemos:

Value 35
Value 32
Valores enviados a través de nuestro Publisher y que llegan al Subscriber

Perfecto! justo el resultado que queríamos. Ahora para acabar, vamos a enviar más errores en nuestra pipeline. Por ejemplo, quiero que pienses qué valor debemos añadir a nuestro operador retry si publicamos los siguientes valores en nuestro Publisher:

stringPublisher.send("Combine")
stringPublisher.send("35")
stringPublisher.send("Swift")
stringPublisher.send("SwiftBeta")
stringPublisher.send("32")
Valores que publicamos en nuestro Publisher

El valor que debemos añadir a nuestro operador retry es 3, ya que vamos a obtener 3 errores al intentar transformar Combine, Swift y SwiftBeta a String. Por lo tanto nuestro código quedaría de la siguiente manera:

stringPublisher
     .tryMap { try mapStringToInt(with: $0) }
     .retry(2)
     .sink(receiveCompletion: { finished in
         print("Completed \(finished)")
     }, receiveValue: { integer in
         print("Value \(integer)")
     })
Operador retry con el valor de 2

Conclusión

El operador retry es muy sencillo de usar y muy potente. Nos permite recuperarnos de errores que se lanzan en nuestro Publisher. Este operador es muy útil cuando queremos seguir recibiendo valores de nuestro Publisher a pesar de que se lancen errores en él.