6

Estoy trabajando con el SDK 3 de Facebook de IOS, y estoy tratando de usarlo con el enfoque más eficiente. Así que me gustaría gestionar algunas solicitudes en hilos separados.Solicitud Async FB con bloque en cuestión de subproceso separado

Por ejemplo esta solicitud (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 ésta para publicar algo en mi alimentación, llamo a un método para cargar el contenido de esta solicitud de forma automática y luego se llamará a este bloque en el método para lanzar la solicitud. Este funciona bien.

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

Esta petición 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]; 

        }); 

      }]; 
    }); 

que estoy tratando de averiguar, pero no entiendo cuál es el problema. Gracias de antemano por su ayuda.

+0

Tendrás que proporcionar más información. ¿A qué te refieres con "no funciona"? –

+0

Gracias por su respuesta, Christopher, y disculpe por la falta de información. Cuando trato de depurar esta segunda solicitud, puedo iniciar sesión hasta la declaración * rq, pero no tengo ningún regreso del bloque del controlador de finalización declarado al iniciar el método startCompletionHandler –

Respuesta

2

No estoy seguro de por qué funciona en un caso y no en el otro, pero creo que tiene que ver con el ciclo de ejecución para la cola de fondo que no se ejecuta después de startWithCompletionHandler: devuelve.

Pero me pregunto por qué lo pones en una cola de fondo de todos modos, ya que es una llamada asíncrona. ¿Por qué no 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]; 
     }); 
}]; 
+0

El problema en mi caso es que el hilo principal ya está ocupado por otras cosas y mi objetivo es cargar la lista de su amigo de Facebook en un hilo diferente para no cargar más pesada que la principal –

+0

Veo, parece que 'FBURLConnection' solo ejecuta un NSURLConnection en el hilo que era invocado desde. Pensé que correría la conexión de red en un hilo de fondo. De lo contrario, ¿por qué exponer una API asíncrona? –

+0

Sí, eso es cierto, no pensé en ello y parece lógico, entonces, ¿qué debo hacer es tratar, por ejemplo, mi lista de 5000 amigos, en un segundo hilo. Porque esta devolución de llamada: 'startWithCompletionHandler:' se ejecuta en la cola principal, por lo que el tratamiento de la lista se enviará desde esta cola principal. ¿Tengo un enfoque correcto? –

6

Tuve este problema por un tiempo.

Asegúrese 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 
        }]; 

     }); 
Cuestiones relacionadas