Solicitud de FB asincrónica con bloque en problema de hilo separado

Estoy trabajando con el IOS Facebook SDK 3, y trato de utilizarlo con el enfoque más eficiente. Entonces, me gustaría gestionar algunas requestes en hilos separados.

Por ejemplo, esta request (FUNCIONA PERFECTAMENTE):

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); dispatch_async(queue, ^{ [self generateShareContentFor:ShareServiceTypeFacebook callback:^(NSMutableDictionary* obj) { FBRequest * rq = [FBRequest requestWithGraphPath:@"me/feed" parameters:obj HTTPMethod:@"POST"]; [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ // TREATING RESULT [[UFBManager defaultManager] errorHandlerFromError:error fromRqType:UFBManagerRqTypePost]; }); }]; }]; }); 
  • Estoy usando este para publicar algo en mi feed, llamo a un método para cargar el contenido de esta request automáticamente y luego este bloque se llamará en el método para iniciar la request. Este funciona bien.

  • El problema es que si no pongo esta request dentro de un bloque, eso no funciona.

Esta request no funciona

  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); dispatch_async(queue, ^{ FBRequest * rq = [FBRequest requestForMe]; [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ // TREATING RESULT [[UFBManager defaultManager] errorHandlerFromError:error fromRqType:UFBManagerRqTypeGet]; }); }]; }); 

Estoy tratando de entender, pero no entiendo cuál es el problema. Gracias de antemano por tu ayuda.

Tuve este problema por un time.

Asegúrate de enviar el código en el hilo principal.

 dispatch_async(dispatch_get_main_queue, ^{ FBRequest * rq = [FBRequest requestForMe]; [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { //The docs say this will be the main queue here anyway //Feel free to go on a background thread at this point }]; }); 

No estoy seguro de por qué funciona en un caso y no en el otro, pero creo que tiene que ver con el bucle de ejecución para su queue de background que no se ejecuta después de startWithCompletionHandler: vuelve.

Pero me pregunto por qué estás colocando eso en una queue de background de todos modos, ya que es una llamada asíncrona. ¿Por qué no simplemente hacer esto desde el hilo principal:

 FBRequest * rq = [FBRequest requestForMe]; [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ [[UFBManager defaultManager] errorHandlerFromError:error fromRqType:UFBManagerRqTypeGet]; }); }];