En este módulo, aprenderemos sobre el multihilo y la concurrencia en Objective-C. Estos conceptos son cruciales para desarrollar aplicaciones eficientes y responsivas, especialmente cuando se manejan tareas que pueden bloquear el hilo principal, como operaciones de red o procesamiento intensivo de datos.

Conceptos Clave

  1. Hilos (Threads): Un hilo es la unidad más pequeña de procesamiento que puede ser programada por un sistema operativo.
  2. Concurrencia: La capacidad de un sistema para ejecutar múltiples tareas al mismo tiempo.
  3. GCD (Grand Central Dispatch): Una tecnología de Apple que facilita la ejecución de tareas en paralelo.
  4. NSOperation y NSOperationQueue: Clases de alto nivel para gestionar operaciones concurrentes.

Hilos en Objective-C

Creación de Hilos

En Objective-C, puedes crear hilos manualmente utilizando la clase NSThread.

// Ejemplo de creación de un hilo
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMethod) object:nil];
[thread start];

// Método que se ejecutará en el hilo
- (void)myThreadMethod {
    @autoreleasepool {
        // Código que se ejecutará en el hilo
        NSLog(@"Hilo en ejecución");
    }
}

Bloques y GCD

Grand Central Dispatch (GCD) es una tecnología que facilita la ejecución de tareas en paralelo utilizando colas de despacho.

Colas de Despacho

  • Serial Dispatch Queue: Ejecuta tareas en orden, una a la vez.
  • Concurrent Dispatch Queue: Ejecuta múltiples tareas en paralelo.

Ejemplo de GCD

// Cola de despacho global concurrente
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// Enviar una tarea a la cola
dispatch_async(queue, ^{
    // Código que se ejecutará en paralelo
    NSLog(@"Tarea en ejecución en cola concurrente");
});

// Cola de despacho serial
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.mySerialQueue", DISPATCH_QUEUE_SERIAL);

// Enviar una tarea a la cola serial
dispatch_async(serialQueue, ^{
    // Código que se ejecutará en orden
    NSLog(@"Tarea en ejecución en cola serial");
});

NSOperation y NSOperationQueue

NSOperation y NSOperationQueue proporcionan una abstracción de alto nivel para gestionar operaciones concurrentes.

Ejemplo de NSOperation

// Crear una operación
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // Código que se ejecutará en la operación
    NSLog(@"Operación en ejecución");
}];

// Crear una cola de operaciones
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

// Añadir la operación a la cola
[operationQueue addOperation:operation];

Ejercicios Prácticos

Ejercicio 1: Crear un Hilo

Objetivo: Crear un hilo utilizando NSThread y ejecutar un método en ese hilo.

Instrucciones:

  1. Define un método que imprima un mensaje en la consola.
  2. Crea un hilo utilizando NSThread y ejecuta el método en ese hilo.

Solución:

- (void)printMessage {
    @autoreleasepool {
        NSLog(@"Mensaje desde el hilo");
    }
}

- (void)createThread {
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(printMessage) object:nil];
    [thread start];
}

Ejercicio 2: Utilizar GCD para Ejecutar Tareas en Paralelo

Objetivo: Utilizar GCD para ejecutar dos tareas en paralelo.

Instrucciones:

  1. Define dos bloques de código que impriman mensajes diferentes en la consola.
  2. Utiliza dispatch_async para enviar estos bloques a una cola concurrente global.

Solución:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{
    NSLog(@"Tarea 1 en ejecución");
});

dispatch_async(queue, ^{
    NSLog(@"Tarea 2 en ejecución");
});

Ejercicio 3: Utilizar NSOperation y NSOperationQueue

Objetivo: Crear y ejecutar una operación utilizando NSOperation y NSOperationQueue.

Instrucciones:

  1. Define un bloque de código que imprima un mensaje en la consola.
  2. Crea una operación utilizando NSBlockOperation.
  3. Añade la operación a una cola de operaciones.

Solución:

NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Operación en ejecución");
}];

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:operation];

Resumen

En esta sección, hemos cubierto los conceptos básicos de multihilo y concurrencia en Objective-C. Aprendimos a crear hilos utilizando NSThread, a ejecutar tareas en paralelo utilizando GCD, y a gestionar operaciones concurrentes con NSOperation y NSOperationQueue. Estos conocimientos son fundamentales para desarrollar aplicaciones eficientes y responsivas.

En el próximo módulo, exploraremos cómo trabajar con datos, incluyendo el manejo de archivos y la serialización/deserialización de datos.

© Copyright 2024. Todos los derechos reservados