-1

В моем случае, когда приложение запускается, я хочу назвать 3 веб-API, используя NSURLSessionDataTask. У меня есть 3 разных метода для каждого API и внутри каждого метода есть один NSURLSessionDataTask.Как выполнить несколько NSURLSessionDataTask серийно?

Я хочу сформировать свой код таким образом, чтобы эти 3 метода выполнялись серийно. Поскольку метод B зависит от ответа метода A, а метод C зависит от ответа метода B. Каждый метод также выполняет некоторые операции с базой данных после получения ответа API. Итак, мне нужно серийное исполнение methodA, methodB и methodC.

Я знаю, что это логичная вещь, но я хочу использовать dispatch_semaphore_t или dispatch_group_wait, но у меня нет абсолютно никакого понятия о том, как я могу использовать их в сочетании с NSURLSessionDataTask.

Я попытался с этим:

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

Приведенный выше код застрял на 1-й метод .. Пожалуйста, помогите мне .. спасибо заранее !!!

+1

Использование NSOperationQueue для любых последовательных операций. –

+0

Концептуально, 'NSURLSession' - это очередь операций !!! – NSPratik

+1

Посмотрите на этот вопрос http://stackoverflow.com/questions/21198404/nsurlsession-with-nsblockoperation-and-queues –

ответ

1

Вы используете их в главной очереди? Не запускайте блоки обратного вызова в той же очереди, что и dispatch_semaphore_wait, потому что dispatch_semaphore_wait блокирует очередь и обратный вызов не будет выполнен, что приведет к блокировке.