Je dois me connecter à Facebook avec mon application, aller chercher des données et APRÈS ceci, connectez-vous également à Firebase. J'utilise les files d'attente d'expédition pour cela mais cela ne fonctionne pas. Mes blocs n'attendent pas les uns les autres pour finir.La file d'attente d'expédition en série n'attend pas
Voici mon code:
dispatch_queue_t loginQueue = dispatch_queue_create("com.balazsvincze.loginQueue", DISPATCH_QUEUE_SERIAL);
//Log in to Facebook
dispatch_async(loginQueue, ^{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions: @[@"public_profile",@"user_friends"] fromViewController:viewController handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if(!error){
NSLog(@"Logged into Facebook");
self.facebookUserID = [[FBSDKAccessToken currentAccessToken] userID];
//Load my profile
[FBSDKProfile loadCurrentProfileWithCompletion:^(FBSDKProfile *profile, NSError *error){
if(!error){
self.name = profile.name;
}
else{
NSLog(@"Could not load profile: %@",error);
completionResult(NO);
return;
}
}];
}
else{
NSLog(@"Could not login: %@",error);
completionResult(NO);
return;
}
}];
});
//Log in to Firebase
dispatch_async(loginQueue, ^{
FIRAuthCredential *credential = [FIRFacebookAuthProvider credentialWithAccessToken:[FBSDKAccessToken currentAccessToken].tokenString];
[[FIRAuth auth] signInWithCredential:credential completion:^(FIRUser *user, NSError *error) {
if(!error){
NSLog(@"Logged into Firebase");
self.firebaseUserID = user.uid;
}
else{
NSLog(@"Could not login: %@",error);
completionResult(NO);
return;
}
}];
});
Toutes les idées? Merci!
Le login Facebook et les connexions Firebase eux-mêmes sont asynchrones, de sorte que votre async a envoyé des blocs de sortie tandis que les connexions asynchrones sont toujours en cours d'exécution. Voir mon explication ici http://stackoverflow.com/questions/42145427/how-does-a-serial-queue-private-dispatch-queue-know-when-a-task-is-complete/42146095?noredirect=1# comment71500175_42146095 – Paulw11
Merci! Je l'ai lu mais j'ai peur que je ne comprends toujours pas ... S'il vous plaît voir ma réponse éditée! –
Vous ne voulez pas la première attente; vous ne voulez qu'une attente lorsque vous voulez bloquer l'achèvement de la tâche précédente. Vous avez toujours besoin de votre dispatch_async ou vous allez bloquer le thread principal sur l'attente. vous pouvez aussi utiliser un dispatch_group_notify car les deux opérations sont indépendantes et vous voulez juste savoir quand les deux sont terminées. – Paulw11