Retraso al actualizar ios elementos de ui desde bloques de Afnetwork

En mi aplicación cuando el usuario presiona un button, comienzo una request asíncrona HTTP (usando AFURLConnectionOperation) y cambio el text de UILabel en el bloque completionHandler. Sin embargo, este cambio no se produce cuando se concluye la request y, en su lugar, ocurre entre 2 y 3 segundos después. A continuación, se muestra un fragment de código que da como resultado este comportamiento.

AFURLConnectionOperation* operation = ... [opration setCompletionBlock:^{ NSLog(@"This text appears immediatly"); [myLabel setText:@"this one is delayed for 2-3 sec"]; }]; [opreation start]; 

tahnks por ayuda

Esto es sintomático de los bashs de intentar realizar actualizaciones de interfaz de usuario desde la queue de background. Su problema se resolverá si agrega la actualización de la interfaz de usuario a la queue principal:

 [operation setCompletionBlock:^{ NSLog(@"This text appears immediately"); [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [myLabel setText:@"this should not be delayed for 2-3 sec"]; }]; }]; 

Como NSOperation documentation de setCompletionBlock para setCompletionBlock , no tiene garantías de en qué hilo se llevará a cabo la operación de finalización:

El context de ejecución exacta para su bloque de finalización no está garantizado, pero normalmente es un hilo secundario. Por lo tanto, no debe usar este bloque para realizar cualquier trabajo que requiera un context de ejecución muy específico. En su lugar, debe derivar ese trabajo al hilo principal de su aplicación o al hilo específico que sea capaz de hacerlo. …

Las actualizaciones de la interfaz de usuario deben llevarse a cabo en la queue principal, por lo que si su bloque de finalización desea realizar actualizaciones de interfaz de usuario, debe agregarlas explícitamente a la queue principal.

AFURLConnectionOperation es una subclass de NSOperation .

Además, mirando AFURLConnectionOperation.m , podemos ver que setCompletionBlock: básicamente solo llama a su súper método (por supuesto, también se encarga de locking y bien establecer la propiedad completionBlock como nil para usted cuando haya terminado).

Nota importante : AFURLConnectionOperation NO realiza el AFURLConnectionOperation completionBlock en el hilo principal para usted. NSOperation se garantiza que NSOperation realice el NSOperation completionBlock en el hilo principal.

Sin embargo, las actualizaciones de la interfaz de usuario (UI) deben suceder en el hilo principal (de lo contrario, pueden ocurrir cosas inesperadas).

Para solucionarlo, debe asegurarse de que las actualizaciones de su interfaz de usuario estén sucediendo en el hilo principal. En el ejemplo, puedes hacer algo como esto:

 [operation setCompletionBlock:^{ NSLog(@"This text appears immediately"); dispatch_async(dispatch_get_main_queue(), ^{ // do your UI updates here... }); }];