Otro tutorial de como realizar operaciones asíncronas con Swift, el mundo de la programación siempre hay varios opciones a la hora de realizar una tarea y en el área móvil con swift no es la excepción, por eso en esta entra estamos realizando un introducción a la librería Promises de parte de Google.
Acorde con el repositorio esta librería solo le agrega un mínimo de overhead a lo que se puede realizar con GCD y es aparte agrega muy poco también a nuestro binario final, por lo que es una buena idea darle una oportunidad. Si has tenido experiencia trabajando con Javascript la libreria te parecera bastante familiar por los metodos que expone esta.
Promises
La instalación es bien simple y directa, en la doc del repo muestra distintas formas de como instalarla, la misma esta disponible para Swift como para Objective-C
// Para Swift pod 'PromisesSwift' // Para Objective-C pod 'PromisesObjC'
Para ver las demas opciones visitar el Repositorio
Promise – Then:
Promise<String>(on: .main) { fulfill, reject in DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) { fulfill("Exito!") } }.then { (valor) in print("Promisa exitosa") }.catch { (error) in print("Promesa error", error) }
En este primer ejemplo tenemos una llamada asincrona donde ejecutamos algo una vez pasan 3 segundos y resolvemos nuestra promesa de forma exitosa. En caso de nuestra operacion asincrona terminar en error solo debemos de llamar el metodo reject y pasarle un error.
Promesas anidadas (Chaining):
Es comun que en nuestro projecto tengamos que buscar un valor en una API y con el resultado de esta buscar otros valores, es bien facil el poder lograrlo, simplemente de esta forma:
Imaginemos que tenemos una funcion que retorna una promsea de esta manera:
func promiseTest() -> Promise<Bool> { return Promise<Bool> { fulfill, reject in DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) { fulfill(true) } } }
El hacer llamadas en cadena es bastante facil:
self.promiseTest() .then { (valor) -> Promise<Bool> in return self.promiseTest() }.then { (valor) -> Void in print("Resultado", valor) }.catch { (error) in print("Error") }
Multiples promesas al mismo tiempo (ALL):
Otra de las tantas funcionalidades que nos permite esta libreria es el poder ejecutar al mismo tiempo multiples operaciones y recibir el resultado de estas una vez sean completadas exitosamente:
// Puede ser una lista de promesas all([self.promiseTest(), self.promiseTest()]) .then { (resultados) -> Void in print("Resultados", resultados) }.catch { (error) in print("Error", error) } // Puede ser simplemente 2 promesas y el resultado sera una tupla de 2 valores all(self.promiseTest(), self.promiseTest()) .then { resultado1, resultado2 -> Void in print("Resultados", resultado1, resultado2) }.catch { (error) in print("Error", error) }