-1

Dans mon cas, quand une application se lance, je veux appeler 3 API Web en utilisant NSURLSessionDataTask. J'ai 3 méthodes différentes pour chaque API et à l'intérieur de chaque méthode, il y en a une NSURLSessionDataTask.Comment exécuter plusieurs NSURLSessionDataTask en série?

Je veux façonner mon code de telle sorte que ces 3 méthodes s'exécutent en série. Parce que la méthode B dépend de la réponse de la méthode A et que la méthode C dépend de la réponse de la méthode B. Chaque méthode effectue également une opération de base de données après l'obtention de la réponse de l'API. Donc, j'ai besoin de l'exécution en série de methodA, methodB et methodC.

Je sais que c'est une chose logique mais je veux utiliser dispatch_semaphore_t ou dispatch_group_wait mais je n'ai absolument aucune idée sur la façon dont je peux utiliser ceux-ci dans une conjonction avec NSURLSessionDataTask.

J'ai essayé avec ceci:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 

    [self syncA:^(BOOL success) { 

     NSLog(@"syncA — Completed"); 
     dispatch_semaphore_signal(semaphore); 
    }]; 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

    [self syncB:^(BOOL success) { 

     NSLog(@"syncB — Completed"); 
     dispatch_semaphore_signal(semaphore); 
    }]; 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

    [self syncC:^(BOOL success) { 

     NSLog(@"syncC — Completed"); 
     dispatch_semaphore_signal(semaphore); 
    }]; 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

    NSLog(@"************* END OF SYNC *************"); 

Le code ci-dessus est collé sur 1ère méthode .. S'il vous plaît aidez-moi .. merci d'avance !!!

+1

utilisez NSOperationQueue pour toutes les opérations en série. –

+0

Conceptuellement, 'NSURLSession' est une file d'attente d'opération !!! – NSPratik

+1

regardez dans cette question http://stackoverflow.com/questions/21198404/nsurlsession-with-nsblockoperation-and-queues –

Répondre

1

Utilisez-vous ceux dans la file d'attente principale? N'exécutez pas les blocs de rappel dans la même file d'attente que dispatch_semaphore_wait, car dispatch_semaphore_wait bloquera la file d'attente et le callback ne sera pas exécuté, ce qui provoquera un verrou mort.