2011-11-17 9 views
5

Estoy tratando de usar el nuevo sendAsynchronousRequest agregado en iOS5. Tengo una clase de modelo (Archivo) con un método que solicita algunos datos de un servidor, y luego transfiero estos datos a la clase de controlador (FilesController) que creó el objeto modelo.sendAsynchronousRequest con tableView reloadData delay en draw

la clase del modelo tiene un método con el siguiente código:

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
    NSArray *files = [self _dictionariesToFiles:decodedResponse]; 
    handler(files); 
}]; 

la clase del controlador, utiliza de esta manera:

[File findAll:conditions completionHandler:^(NSArray *files) { 
    dataSource = files; 

    NSLog(@"set"); 

    [self.tableView reloadData]; 

    NSLog(@"reload"); 

    activityIndicator.hidden = TRUE; 
}]; 

En la consola puedo ver inmediatamente cómo el NSLogs muestra el mensajes de "configuración" y "recarga", pero la tabla y el indicador no cambian hasta que hayan transcurrido algunos segundos (5-10 segundos).

¿Alguien sabe dónde está el problema?

Gracias.

PD: Cambié la solicitud asincrónica por una compatible y sincronizada, y luego el problema desapareció pero quiero usar una solicitud asíncrona para esto.

Este es el código de sincronización compatibles:

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; 
NSArray *files = [self _dictionariesToFiles:decodedResponse]; 
handler(files); 

Respuesta

16

lo que necesita hacer [tableView reloadData] en el hilo principal. Todas las operaciones de UI se deben realizar en el hilo principal. Múltiples formas de hacer esto. Una de ellas es:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
    activityIndicator.hidden = TRUE; 
}); 

EDIT: añadido a activityIndicator ejemplo

3

que tenía varios problemas usando: [[NSOperationQueue alloc] init] pero utilizando [NSOperationQueue mainQueue] todo es perfecto. Usando una nueva cola, la línea de ejecución no sigue la secuencia natural

+2

Esto se debe a que mainQueue se ejecuta en el hilo principal, que es donde tienen que pasar todas las cosas de la interfaz de usuario. – greenisus

+0

@Rscorreia greenisus es correcto. Tuve el mismo problema que tú hasta que descubrí esto. –

+0

@greenisus Entonces, ¿cómo se llega a una solicitud asíncrona para trabajar rápidamente? Si hace '' '[NSOperationQueue mainQueue]' '', lo pone en el hilo principal, lo que frustra el propósito de usar una solicitud asincrónica en primer lugar ....? – Supertecnoboff