Fetching latest headlines…
[GCD] Dispatch Queue: cola FIFO, prioridad y tipos de colas
NORTH AMERICA
🇺🇸 United StatesJune 30, 2026

[GCD] Dispatch Queue: cola FIFO, prioridad y tipos de colas

1 views0 likes0 comments
Originally published byDev.to

Una DispatchQueue es el objeto al que se le envía trabajo en GCD. No se le envían hilos, se le envían closures (bloques de código), y es la cola la que decide cómo y cuándo ejecutarlas.

FIFO: orden de inicio, no de finalización

Una DispatchQueue es una cola FIFO (first in, first out): las tareas empiezan a ejecutarse en el orden en que se despacharon. Esto no implica que terminen en ese mismo orden — eso depende de si la cola es serial o concurrente (lo cual cubro en los próximos dos artículos). Lo único garantizado por el FIFO es el orden de inicio.

Prioridad: Quality of Service (QoS)

Cada tarea que se despacha tiene una prioridad asociada, expresada como DispatchQoS. El sistema usa esa prioridad para decidir qué tarea atender primero cuando varias compiten por CPU:

  • .userInteractive: la más alta. Trabajo que bloquea directamente la interfaz (animaciones, actualizar UI).
  • .userInitiated: trabajo que el usuario está esperando activamente (abrir un documento, procesar el resultado de un tap).
  • .default: prioridad por defecto cuando no se especifica una explícita.
  • .utility: trabajo de larga duración que no necesita resultado inmediato (descargas, procesamiento de datos, con barra de progreso visible).
  • .background: la más baja. Trabajo que el usuario no percibe (sincronización en segundo plano, indexación). A mayor prioridad, más recursos del sistema se le asignan a esa tarea frente a las demás. Elegir mal la prioridad no rompe el código, pero sí puede degradar el rendimiento percibido: marcar todo como .userInteractive no hace que todo corra más rápido, satura el sistema y termina compitiendo consigo mismo.

Tipos de cola

GCD expone tres formas de obtener una DispatchQueue:

// 1. Cola principal: serial, ligada al hilo principal (UI)
let main = DispatchQueue.main

// 2. Colas globales: concurrentes, provistas por el sistema, una por cada QoS
let global = DispatchQueue.global(qos: .userInitiated)

// 3. Cola propia: serial por defecto
let custom = DispatchQueue(label: "com.miapp.tareas")

// 3b. Cola propia, hecha concurrente explícitamente
let customConcurrent = DispatchQueue(label: "com.miapp.tareas-concurrentes", attributes: .concurrent)

Cola principal (DispatchQueue.main). Es serial y siempre ejecuta en el hilo principal. Todo lo que toca UI debe pasar por aquí.

Colas globales (DispatchQueue.global(qos:)). Son concurrentes y las administra el sistema. No se crean, se obtienen — hay una por cada nivel de QoS, y se comparten con el resto de la app (y potencialmente con otros procesos del sistema).

Colas propias (DispatchQueue(label:)). Las crea el desarrollador. Por defecto son seriales; se vuelven concurrentes solo si se especifica attributes: .concurrent. El label no afecta el comportamiento — sirve únicamente para identificar la cola en herramientas de depuración como Instruments.

Lo que viene

Ya con cola serial vs. concurrente identificadas, lo que falta es ver cómo cambia el comportamiento al despachar trabajo de forma síncrona o asíncrona en cada una. Eso son los siguientes cuatro artículos.

Bibliografía

Comments (0)

Sign in to join the discussion

Be the first to comment!