2015-05-14 20 views
7

Ho il codice seguente:FBSDKGraphRequest in un quadro bulloni non richiama il blocco

[[[PFFacebookUtils logInInBackgroundWithAccessToken:[FBSDKAccessToken currentAccessToken]] continueWithSuccessBlock:^id(BFTask *task) { 

    PFUser *user = task.result; 

    return user; 

}] continueWithSuccessBlock:^id(BFTask *task) { 

    BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; 

    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]; 

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 

     if (error) { 
      [source setError:error]; 
      return; 
     } 

     [source setResult:result]; 
    }]; 

    return source.task; 
}]; 

Il FBSDKGraphRequest funziona bene al di fuori del compito bulloni, ma all'interno del compito startWithCompletionHandler non viene chiamato.

Qualche idea?

risposta

20

Ho trovato una soluzione alternativa. Basta avvolgerlo in un blocco thread principale. Funzionerà come un fascino.

dispatch_async(dispatch_get_main_queue(), ^{ 
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]; 

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 

     if (error) { 
      [source setError:error]; 
      return; 
     } 

     [source setResult:result]; 
    }]; 
}); 
+3

Questa è una soluzione enorme. Dovrebbe avere più upvotes. Grazie @yuhua! – maxhud

+0

non chiama mai il blocco del gestore :( –

+1

ha funzionato per me. Stavo chiamando questo "initWithGraphPath" dal thread in background e apparentemente dovrebbe essere invocato dal thread principale. –

2

Abbiamo avuto lo stesso problema esatto e abbiamo usato la stessa soluzione, ma io non riesco a trovare nessun post che spiegano perché questo sta accadendo.

+1

Ora è tutto open source che dovremmo essere in grado di Risolvi il motivo per cui ti rivisiterò se avrò il tempo e ti ricontatterò –

+0

Grazie! Fammi sapere se c'è qualcosa che posso aiutare o guardare a me stesso. Potrei avere del tempo libero questa settimana per dare una mano . – Constantine

2

Mi sono imbattuto nello stesso problema. Sembra che PFFacebookUtils stia eseguendo il suo blocco di continuazione su un thread diverso, ma sembra che FBSDKGraphRequest si aspetti di essere avviato dal thread principale. Ho trovato che il problema può essere risolto alternativamente specificando un esecutore.

BFTask* loginTask = [PFFacebookUtils logInInBackgroundWithReadPermissions:@[]]; 
[loginTask continueWithExecutor:[BFExecutor mainThreadExecutor] withSuccessBlock:^id _Nullable(BFTask * _Nonnull task) { 
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil]; 
    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
     // This code gets called properly 
    }]; 
}];