2011-05-24 15 views
12

Estoy usando bloques Objective-C y Operation Queues por primera vez. Estoy cargando algunos datos remotos mientras que la IU principal muestra una ruleta. Estoy usando un bloque de finalización para decirle a la tabla que vuelva a cargar sus datos. Como documentation mentions, el bloque de finalización no se ejecuta en el hilo principal, por lo que la tabla vuelve a cargar los datos, pero no vuelve a pintar la vista hasta que se hace algo en el hilo principal, como arrastrar la tabla.¿Es este el uso correcto de un bloque de finalización Operation Queue?

La solución que estoy usando ahora es una cola de envío, ¿es esta la "mejor" manera de actualizar la UI desde un bloque de finalización?

// define our block that will execute when the task is finished 
    void (^jobFinished)(void) = ^{ 
     // We need the view to be reloaded by the main thread 
     dispatch_async(dispatch_get_main_queue(),^{ 
      [self.tableView reloadData]; 
     }); 
    }; 

    // create the async job 
    NSBlockOperation *job = [NSBlockOperation blockOperationWithBlock:getTasks]; 
    [job setCompletionBlock:jobFinished]; 

    // put it in the queue for execution 
    [_jobQueue addOperation:job]; 

actualización Por sugerencia de @ gcamp, el bloque de terminación ahora utiliza la cola de operaciones principal en lugar de GCD:

// define our block that will execute when the task is finished 
void (^jobFinished)(void) = ^{ 
    // We need the view to be reloaded by the main thread 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.tableView reloadData]; }]; 
}; 

Respuesta

17

eso es exactamente la misma. También puede usar [NSOperationQueue mainQueue] si desea usar una cola de operación en lugar de GCD para su bloque de finalización.

+0

Genial, no sabía sobre mainQueue. Un poco más limpio y más consistente de esa manera. ¡Gracias! –

+0

¿Existe una diferencia real entre usar [NSOperationQueue mainQueue] y dispatch_get_main_queue()? –

+1

En materia de resultado, no. Pero es diferente en cómo lo usas. 'NSOperationQueue' usa (obviamente)' NSOperation' y GCD (dispatch_get_main_queue) usa block. – gcamp

Cuestiones relacionadas