En aquest tema, explorarem com gestionar múltiples fils d'execució en Objective-C per millorar el rendiment i la resposta de les aplicacions. La concurrència permet que les aplicacions realitzin múltiples tasques simultàniament, aprofitant millor els recursos del sistema.

Conceptes Bàsics de Concurrència

Què és la Concurrència?

La concurrència és la capacitat d'executar múltiples tasques al mateix temps. En el context de la programació, això significa que diferents parts del codi poden executar-se simultàniament, millorant l'eficiència i la velocitat de l'aplicació.

Avantatges de la Concurrència

  • Millora del Rendiment: Permet que les aplicacions aprofitin millor els recursos del sistema.
  • Millora de la Resposta: Les aplicacions poden continuar responent a l'usuari mentre es realitzen tasques en segon pla.
  • Escalabilitat: Facilita la gestió de tasques complexes i de gran volum.

Grand Central Dispatch (GCD)

Grand Central Dispatch (GCD) és una tecnologia d'Apple que facilita la gestió de fils i la concurrència. GCD proporciona una API de nivell baix per gestionar cues de tasques.

Cues de Tasques

GCD utilitza cues de tasques per gestionar la concurrència. Hi ha dos tipus principals de cues:

  • Cues Serials: Executen una tasca a la vegada en l'ordre en què es van afegir.
  • Cues Concurrents: Permeten l'execució simultània de múltiples tasques.

Exemple de GCD

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{
    // Codi que s'executarà en segon pla
    NSLog(@"Aquesta tasca s'executa en segon pla");
});

NSLog(@"Aquesta tasca s'executa en el fil principal");

En aquest exemple, la tasca dins del bloc dispatch_async s'executa en segon pla, mentre que el codi fora del bloc s'executa en el fil principal.

Operacions i Cues d'Operacions

A més de GCD, Objective-C també proporciona la classe NSOperation i NSOperationQueue per gestionar la concurrència.

NSOperation

NSOperation és una classe abstracta que representa una tasca que es pot executar de manera concurrent.

NSOperationQueue

NSOperationQueue és una classe que gestiona un conjunt d'objectes NSOperation.

Exemple d'NSOperation

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // Codi que s'executarà en segon pla
    NSLog(@"Aquesta operació s'executa en segon pla");
}];

[operationQueue addOperation:operation];

NSLog(@"Aquesta tasca s'executa en el fil principal");

En aquest exemple, la tasca dins del bloc NSBlockOperation s'executa en segon pla, mentre que el codi fora del bloc s'executa en el fil principal.

Exercicis Pràctics

Exercici 1: Utilitzar GCD per Executar una Tasca en Segon Pla

Objectiu: Crear una aplicació que executi una tasca en segon pla utilitzant GCD.

Instruccions:

  1. Crea un projecte nou en Xcode.
  2. Afegeix el següent codi al mètode viewDidLoad del teu ViewController:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{
    for (int i = 0; i < 5; i++) {
        NSLog(@"Tasca en segon pla %d", i);
        [NSThread sleepForTimeInterval:1];
    }
});

NSLog(@"Tasca en el fil principal");

Solució:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"Tasca en segon pla %d", i);
            [NSThread sleepForTimeInterval:1];
        }
    });

    NSLog(@"Tasca en el fil principal");
}

Exercici 2: Utilitzar NSOperation per Executar una Tasca en Segon Pla

Objectiu: Crear una aplicació que executi una tasca en segon pla utilitzant NSOperation.

Instruccions:

  1. Crea un projecte nou en Xcode.
  2. Afegeix el següent codi al mètode viewDidLoad del teu ViewController:
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    for (int i = 0; i < 5; i++) {
        NSLog(@"Operació en segon pla %d", i);
        [NSThread sleepForTimeInterval:1];
    }
}];

[operationQueue addOperation:operation];

NSLog(@"Tasca en el fil principal");

Solució:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"Operació en segon pla %d", i);
            [NSThread sleepForTimeInterval:1];
        }
    }];

    [operationQueue addOperation:operation];

    NSLog(@"Tasca en el fil principal");
}

Errors Comuns i Consells

Errors Comuns

  • Accés Concurrent a Recursos Compartits: Assegura't de sincronitzar l'accés a recursos compartits per evitar condicions de carrera.
  • Bloqueig del Fil Principal: Evita executar tasques llargues en el fil principal per mantenir la resposta de l'aplicació.

Consells

  • Utilitza Cues Serials per Tasques Dependents: Si les tasques depenen l'una de l'altra, utilitza cues serials per assegurar l'ordre d'execució.
  • Utilitza Cues Concurrents per Tasques Independents: Si les tasques són independents, utilitza cues concurrents per millorar el rendiment.

Conclusió

En aquesta secció, hem après els conceptes bàsics de la concurrència i com utilitzar GCD i NSOperation per gestionar múltiples fils d'execució en Objective-C. La concurrència és una eina poderosa per millorar el rendiment i la resposta de les aplicacions, però s'ha d'utilitzar amb cura per evitar errors comuns com les condicions de carrera i el bloqueig del fil principal. Amb la pràctica, podràs aprofitar aquestes tècniques per crear aplicacions més eficients i responsives.

© Copyright 2024. Tots els drets reservats