web-dev-qa-db-fra.com

Comment écrire la méthode à exécuter après l'achèvement de deux méthodes (ios)

J'ai deux méthodes à exécuter sur un événement de clic sur un bouton, par exemple method1: et method2:. Les deux ont des appels réseau et ne peuvent donc pas être sûrs de celle qui finira en premier.

Je dois exécuter une autre méthode methodFinish après l'achèvement method1: et method2:

-(void)doSomething
{

   [method1:a];
   [method2:b];

    //after both finish have to execute
   [methodFinish]
}

Comment puis-je atteindre cet autre que le start method1:-> completed -> start method2: ->completed-> start methodFinish typique 

Lisez à propos de blocks.Je suis très novice dans blocks.Est-ce que quelqu'un peut m'aider à en écrire un? Et toute explication vous sera très utile.Merci

23
Lithu T.V

Ceci est ce que les groupes d'expédition sont pour. 

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();

// Add a task to the group
dispatch_group_async(group, queue, ^{
  [self method1:a];
});

// Add another task to the group
dispatch_group_async(group, queue, ^{
  [self method2:a];
});

// Add a handler function for when the entire group completes
// It's possible that this will happen immediately if the other methods have already finished
dispatch_group_notify(group, queue, ^{
   [methodFinish]
});

Les groupes d’expédition sont gérés par ARC. Ils sont conservés par le système jusqu'à l'exécution de tous leurs blocs, ce qui facilite leur gestion de la mémoire sous ARC.

Voir aussi dispatch_group_wait() si vous souhaitez bloquer l'exécution jusqu'à la fin du groupe.

52
Rob Napier

La petite méthode intéressante que j'ai obtenue de Google Framework iOS s'appuie beaucoup sur:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {


    if (signInDoneSel) {
        [self performSelector:signInDoneSel];
    }

}
0
ChuckKelly