-1

In meinem Fall, wenn eine App startet, möchte ich 3 Web-APIs mit NSURLSessionDataTask aufrufen. Ich habe 3 verschiedene Methoden für jede API und in jeder Methode gibt es eine NSURLSessionDataTask.Wie mehrere NSURLSessionDataTask seriell ausgeführt werden?

Ich möchte meinen Code so gestalten, dass diese drei Methoden seriell auszuführen. Da Methode B von der Antwort von Methode A abhängig ist, hängt Methode C von der Antwort von Methode B ab. Jede Methode führt nach der API-Antwort auch eine Datenbankoperation aus. Also, ich brauche eine serielle Ausführung von methodA, methodB und methodC.

Ich weiß, dass dies eine logische Sache ist, aber ich will dispatch_semaphore_t oder dispatch_group_wait verwenden, aber ich habe absolut keine Ahnung, wie ich das in einer Verbindung mit NSURLSessionDataTask verwenden kann.

Ich habe mit dieser versucht:

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 *************"); 

Der obige Code am 1. Methode .. steckt Bitte mir helfen .. Vielen Dank im Voraus !!!

+1

Verwenden Sie NSOperationQueue für alle seriellen Operationen. –

+0

Konzeptionell ist 'NSURLSession' eine Operationswarteschlange !!! – NSPratik

+1

Blick in diese Frage http://stackoverflow.com/questions/21198404/nsurlsession-with-nsblockoperation-and-queues –

Antwort

1

Verwenden Sie diese in der Hauptwarteschlange? Führen Sie die Callback-Blöcke nicht in derselben Warteschlange aus wie dispatch_semaphore_wait, da dispatch_semaphore_wait die Warteschlange blockiert und der Rückruf nicht ausgeführt wird, was zu einer Dead-Sperre führt.

Verwandte Themen