Transformar y combinar flujos
Utilice flatMap, merge, combineLatest y zip.
Transformar y combinar flujos es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.
Trabajar con streams
En Combine, un publisher emite un flujo de valores a lo largo del tiempo. La verdadera potencia está en los operadores, que transforman y combinan estos flujos para crear otros nuevos.
En esta lección se presentan los operadores de transformación y combinación más importantes: flatMap, merge, combineLatest y zip.
map frente a flatMap
map transforma cada valor en otro valor. flatMap va más allá: transforma cada valor en un publisher nuevo y aplana los resultados en un único flujo.
Use flatMap cuando cada entrada deba iniciar otra operación asíncrona.
flatMap en acción
Aquí, un flujo de identificadores de usuario se transforma en un flujo de solicitudes de red, que se aplana en un único flujo de usuarios.
userIdPublisher
.flatMap { id in
apiClient.fetchUser(id: id)
}
.sink { user in
print("Loaded", user.name)
}
.store(in: &cancellables)Controlar la concurrencia de flatMap
De forma predeterminada, flatMap se suscribe a todos los publishers internos a la vez. Puede limitar la concurrencia con maxPublishers para evitar saturar un servidor.
idsPublisher
.flatMap(maxPublishers: .max(2)) { id in
apiClient.fetchUser(id: id)
}
.sink { print($0) }
.store(in: &cancellables)merge
merge intercala valores de varios publishers del mismo tipo en un único flujo y emite cada valor en cuanto llega.
let combined = buttonTapA
.merge(with: buttonTapB)
combined
.sink { print("A tap from either button") }
.store(in: &cancellables)combineLatest
combineLatest emite cada vez que emite cualquiera de los publishers de entrada, combinando el valor más reciente de cada uno. Es perfecto para validar formularios en los que deben tenerse en cuenta varios campos.
usernamePublisher
.combineLatest(passwordPublisher)
.map { name, pass in
!name.isEmpty && pass.count >= 8
}
.sink { isValid in
print("Form valid:", isValid)
}
.store(in: &cancellables)Comportamiento de combineLatest
Nota: combineLatest no emite nada hasta que todas las entradas han producido al menos un valor. Después, cada nueva emisión de cualquier entrada activa la salida combinada con los valores más recientes de las demás.
zip
zip empareja los valores por índice: el primero de A con el primero de B, el segundo con el segundo, y así sucesivamente. Espera a que ambos lados tengan un valor en cada posición.
let names = ["Ann", "Bob", "Cy"].publisher
let ages = [30, 25, 41].publisher
names
.zip(ages)
.sink { name, age in
print(name, "is", age)
}
.store(in: &cancellables)combineLatest frente a zip
Es fácil confundirlos:
- combineLatest: se activa con cualquier emisión y utiliza el valor más reciente de cada entrada
- zip: se activa únicamente con pares que coinciden por índice
Use combineLatest para el estado en tiempo real y zip para alinear resultados paralelos uno a uno.
Combinar para trabajar en paralelo
zip resulta especialmente útil al ejecutar solicitudes independientes en paralelo y esperar a que terminen todas.
fetchProfile
.zip(fetchSettings)
.sink { profile, settings in
print("Both loaded")
}
.store(in: &cancellables)Encadenar operadores
Las pipelines reales encadenan varios operadores para expresar flujos asíncronos complejos de forma declarativa.
searchTextPublisher
.removeDuplicates()
.flatMap { query in
apiClient.search(query)
}
.map { results in
results.prefix(10)
}
.sink { print($0) }
.store(in: &cancellables)Comprobación rápida
Compruebe sus conocimientos sobre los operadores.
Resumen
Ha aprendido a transformar y combinar streams:
- flatMap: convierte valores en publishers y los aplana
- merge: intercala streams del mismo tipo
- combineLatest: utiliza el valor más reciente de cada uno y se activa con cualquier emisión
- zip: crea pares que coinciden por índice
Estos operadores permiten componer lógica asíncrona compleja de forma declarativa.
Preguntas frecuentes
¿La lección «Transformar y combinar flujos» es gratis?
Sí — el texto completo de «Transformar y combinar flujos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Transformar y combinar flujos»?
Utilice flatMap, merge, combineLatest y zip. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Swift Academy?
No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Transformar y combinar flujos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Swift Academy?
Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Transformar y combinar flujos
- Planificadores y subprocesos
- Operadores de gestión de errores
- Publishers y Subscribers personalizados