Recuerdo con tristeza mi primer empleo, no porque lo extrañe, sino porque fue un trabajo donde apenas aprendí como hacer cosas sino como NO HACERLAS. Recuerdo cientos y cientos de lineas de código sin ton ni son, código mal estructurado, grandes consultas SQL y sobretodo muchos bloqueos por culpa del código que gestionaba la Base de Datos. Hoy, casi cuatro años después siempre acudo a código de ese tipo cuando intento enseñar o contar algo a alguien con algún ejemplo de como NO HACER las cosas.

Bloqueo de una base de datos

 

Haciendo el curso de Udemy de Fernando Rodriguez he aprendido como usar el Grand Central Dispach (GDC) para enviar código a segundo plano y crear métodos que aceptan bloques como parámetros, una especie de Callbacks en Objective-C.

Cuando intentamos ejecutar un código que tarde mucho en su ejecución, si lo ejecutamos en el hilo principal, la aplicación se queda parada y, si hacemos aplicaciones para apple, nuestra aplicación será rechazada y no se publicará en el Apple Store.

Para ponernos en contexto, vamos a imaginarnos que queremos descargar una imagen muy pesada de Internet y ponerla en nuestra aplicación. Si ejecutamos el siguiente código:

    NSURL *url = [NSURL URLWithString:@"http://elhorizonte.mx/foto/470000/475983_6.jpg"];
    NSData *imgData = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:imgData];

    self.photoView.image = image;

La aplicación se quedará bloqueada y no podrá usarse durante unos segundos o, incluso minutos.

Para poder ejecutar esta aplicación en segundo plano es necesario usar el GCD y enviar un bloque de finalización. Este bloque de finalización le dirá a la aplicación que tiene que hacer cuando finalice.

[self imageWith:^(UIImage *image) {
    self.photoView.image = image;
}];
    //Download the image in a second queue
    dispatch_queue_t download = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(download, ^{
        NSURL *url = [NSURL URLWithString:@"http://elhorizonte.mx/foto/470000/475983_6.jpg"];
        NSData *imageData = [NSData dataWithContentsOfURL:url];

        dispatch_async(dispatch_get_main_queue(), ^{
            //Execute finalization block
            UIImage *image = [UIImage imageWithData:imageData];
            completionBlock(image);
        });
    });

Siempre que creamos que nuestra aplicación puede tardar mucho en ejecutar una operación, debemos intentar ejecutarla en Segundo plano. Ambas aplicaciones las puedes encontrar en mi repositorio de GitHub.

Last modified: 08/08/2020