Appel d'un segue sur le main thread depuis un appel asynchrone

NonoNono Membre

Bonjour,


 


J'ai un petit problème de gestion des threads et je ne comprends pas vraiment ce qu'il se passe. Je vous explique mon problème.


 


Mon application utilise une connexion Facebook, j'utilise un manager qui notifie mon controller via un delegate lorsque la connexion et la récupération d'information de Facebook est terminée. Dans la méthode du delegate, j'exécute le code suivant :



RemoteCallManager *rcm = [[RemoteCallManager alloc] init];

if (![[NSUserDefaults standardUserDefaults] boolForKey:IS_FIRST_LAUNCH])
{
// Is first launch
[rcm sendNewUserProfile:self.player andSuccessBlock:^(NSDictionary *result) {
[self.player setHash:[result valueForKey:@hash]];

[[Utils sharedInstance] extractAndSaveSessionDataWithResultFromRequest:result];

[(AppDelegate*)[[UIApplication sharedApplication] delegate] setPlayer:self.player];
[(AppDelegate*)[[UIApplication sharedApplication] delegate] archivePlayerObject];
[(AppDelegate*)[[UIApplication sharedApplication] delegate] archiveGameSession];

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:IS_FIRST_LAUNCH];

[self performSegueWithIdentifier:@pushToMenu sender:self];

} andErrorBlock:^(NSString *description) {
NSLog(@An error occured : %@", description);
}];
}
else
{
// Is not first launch
[self pushToMenu];
}

Mon RemoteCallManager est un manager qui va simplement envoyer les informations de l'utilisateur sur le serveur, si la requête se termine avec succès, je veux passer sur le controller suivant.


 


Mon soucis est que le segue ne fonctionne pas, la méthode prepareForSegue est bien appelée. Je pense que le problème vient du fait que les requêtes sont exécuté en asynchrone et donc dans un autre thread. J'ai donc essayé d'appeler mon segue comme ceci, afin de l'exécuter dans le thread principal :



dispatch_sync(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@pushToMenu sender:self];
});

Comme tel, la méthode prepareForSegue n'est jamais appelée. Ensuite j'ai remplacé dispatch_sync par dispatch_async, ce qui me fait revenir à  la case départ.


 


Là , je ne sais plus trop quoi faire, cela fait plusieurs jours que j'essaye de résoudre ce problème. À mon avis, j'ai mal compris le fonctionnement de dispatch_sync et dispatch_async.


 


Quelqu'un aurait-il une piste ? Y-a t'il un moyen de voir dans quel thread je me trouve au moment de l'appel du segue ?


 


J'espère que j'ai été assez clair, n'hésitez pas si j'ai oublié des infos et merci d'avance pour votre aide.


Connectez-vous ou Inscrivez-vous pour répondre.