2 votes

Comment afficher une UIAlertView à partir d'un bloc sur iOS?

Quel est le meilleur moyen d'afficher une UIAlertView à partir d'un bloc ?

J'ai l'action suivante dans mon code :

- (IBAction)connectWithTwitterClicked:(id)sender {
    ACAccountStore * account = [[ACAccountStore alloc]init];
    ACAccountType * accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];

    [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) {
        if (granted == YES){
            NSLog(@"Le compte Twitter a été accordé");
            NSArray * arrayOfAccounts = [account accountsWithAccountType:accountType];
            if([arrayOfAccounts count] > 0){
                ACAccount * twitterAccount = [arrayOfAccounts lastObject];
                NSLog(@"Identifiant Twitter trouvé : [%@]", twitterAccount.username);
                // continuer en utilisant l'identifiant Twitter
            } else {
                // aucun compte Twitter trouvé, affiche une alerte pour notifier l'utilisateur
            }
        } else{
            NSLog(@"Aucun compte Twitter n'a été accordé");
            // aucun compte Twitter trouvé, affiche une alerte pour notifier l'utilisateur
        }
    }];
}

J'ai essayé ces solutions jusqu'à présent :

  1. Sur l'une des 2 lignes commentées, créer et afficher directement une UIAlertView, cela fait planter l'application, je pense que cela est dû au fait que le bloc est un processus asynchrone et n'a pas accès au thread UI pour afficher l'alerte
  2. Créer un NSMutableString en dehors du bloc, le marquer avec __block, le définir sur les lignes commentées et l'afficher ensuite. Problème similaire ici où le bloc s'exécute de manière asynchrone donc au moment d'afficher l'alerte, il n'y a aucune garantie que le NSMutableString ait été défini.

Quelqu'un peut-il suggérer une solution ? Je veux pouvoir notifier l'utilisateur d'une manière ou d'une autre afin qu'il puisse soit ne pas utiliser Twitter, soit aller configurer un compte dans les paramètres de l'appareil.

Merci

11voto

newacct Points 42530

Voici la façon de faire de GCD :

[SomeClass dispatchNastyAsyncBlock:^{
    // ... faire des trucs, puis
    dispatch_async(dispatch_get_main_queue(), ^ {
        [[[[UIAlertView alloc] initWithTitle:t
                                     message:nil
                                    delegate:nil
                           cancelButtonTitle="OK"
                           otherButtonTitles:nil
        ] autorelease] show];
    });
}];

8voto

Créez une méthode qui affiche la vue d'alerte, puis exécutez son sélecteur sur le thread principal :

- (void)showAlertWithTitle:(NSString *)t
{
    [[[[UIAlertView alloc] initWithTitle:t
                                 message:nil
                                delegate:nil
                       cancelButtonTitle:@"OK"
                       otherButtonTitles:nil
    ] autorelease] show];
}

Appelez-le comme suit :

[SomeClass dispatchNastyAsyncBlock:{
    // ... faire quelque chose, puis
    [self performSelectorOnMainThread:@selector(showAlertWithTitle:)
                           withObject:@"Voici le titre"
                        waitUntilDone:YES];
}];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X