/* Page prose (es) */
"DispatchGroupFinishLine" = "# `DispatchGroup`: una línea de meta para muchas tareas\n\nUn **`DispatchGroup`** es un contador que sigue un conjunto de tareas para que puedas recibir un aviso cuando todo el conjunto se complete. Marcas que una tarea se une al grupo con `enter()`, y la marcas como terminada con `leave()`. Cuando el número de llamadas a `leave()` alcanza al número de llamadas a `enter()` (el grupo está **vacío**), el grupo se dispara.";
"DispatchGroupFinishLine-2" = "`notify(queue:)` es la línea clave: registra un bloque para ejecutarse **más tarde**, en la cola que nombres, en el momento en que el grupo queda vacío. **No** bloquea. Tu código sigue fluyendo justo de largo.\n\n**Míralo en acción:** dos cosas para notar. Primero, `📤 Batch sent...` se imprime antes que cualquier bebida; `notify` no bloqueó. Segundo, las bebidas aparecen en **orden de finalización** (cold brew, luego espresso, luego latte), *no* en el orden en que las iniciaste, exactamente la lección de un capítulo anterior. Pero la línea de la bandeja siempre viene **al final**, después de las tres, porque el grupo esperó a cada `leave()`. Ese es todo el sentido: obtienes un único y limpio callback de \"todo listo\" sin importar en qué orden terminen las tareas.\n\n* callout(Pruébalo): Intercambia los tiempos de preparación para que el latte sea `0.1` y el cold brew `0.9`. Las bebidas se reordenan, pero ¿la línea de la bandeja sigue quedando al final?\n\n> Cuando el trabajo es una simple clausura `async`, puedes saltarte el par manual y dejar que la cola lo equilibre por ti: `barista.async(group: group) { ... }`. Es un **atajo** que llama a `enter()` antes de tu bloque y a `leave()` después. Usa el `enter()`/`leave()` manual cuando el momento de \"terminado\" sea un *callback* que se dispara más tarde (como un completion handler de red) donde no hay una única clausura cuyo final signifique \"terminado.\"\n\n[Anterior](@previous)  |  página 3 de 8  |  [Siguiente: wait(): la alternativa que bloquea](@next)";
