6

Sto lavorando con l'IOS Facebook SDK 3 e sto cercando di usarlo con l'approccio più efficiente. Quindi vorrei gestire alcune richieste in thread separati.Richiesta FB asincrona con blocco nel thread separato Problema

Per esempio questa richiesta (FUNZIONA PERFETTAMENTE):

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]; 
       }); 

      }]; 
    }]; 

}); 
  • sto usando questo per postare qualcosa sul mio feed, che io chiamo un metodo per caricare il contenuto di questa richiesta automaticamente e quindi questo blocco verrà chiamato nel metodo per avviare la richiesta. Questo funziona bene.

  • Il problema è che se non inserisco questa richiesta all'interno di un blocco, ciò non funziona.

Questa richiesta non funziona

 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]; 

        }); 

      }]; 
    }); 

sto cercando di capire, ma non capisco qual è il problema. Grazie in anticipo per il vostro aiuto.

+0

Dovrai fornire ulteriori informazioni. Cosa intendi con "non funziona"? –

+0

Grazie per la risposta, Christopher, e mi dispiace per la mancanza di informazioni. Quando provo a eseguire il debug di questa seconda richiesta, posso registrare fino alla dichiarazione * rq, ma non ho alcun ritorno del gestore del blocco di completamento dichiarato durante l'avvio del metodo startCompletionHandler –

risposta

2

Non sono positivo perché funziona in un caso e non nell'altro, ma penso che abbia a che fare con il ciclo di esecuzione per la coda di sfondo non in esecuzione dopo i ritorni startWithCompletionHandler:.

Ma mi chiedo perché lo si metta comunque su una coda di sfondo, poiché si tratta di una chiamata asincrona. Perché non farlo dal thread principale:

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

Il problema nel mio caso è che il thread principale è già occupato da altre cose e il mio obiettivo è caricare la lista del tuo amico di Facebook in una discussione diversa per non gravare di più quella principale –

+0

Vedo, sembra che 'FBURLConnection' stia eseguendo una connessione NSURLC sul thread che era invocato da. Avrei pensato che avrebbe eseguito la connessione di rete su un thread in background. Altrimenti, perché esporre un'API asincrona? –

+0

Sì, è vero, non ci ho pensato e sembra logico, quindi quello che dovrei fare è trattare, ad esempio la mia lista di 5000 amici, in una seconda discussione. Poiché questo callback: "startWithCompletionHandler:" viene eseguito nella coda principale, quindi il trattamento dell'elenco verrà inviato da questa coda principale? Ho un approccio corretto? –

6

Ho avuto questo problema per un po '.

Assicurarsi di aver inviato il codice sulla filettatura principale.

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 
        }]; 

     }); 
Problemi correlati