如何串行执行多个NSURLSessionDataTask?

时间:2016-03-29 12:16:22

标签: ios grand-central-dispatch nsurlsession dispatch-async nsurlsessiondatatask

就我而言,当应用程序启动时,我想使用NSURLSessionDataTask调用3个Web API。我为每个API提供了3种不同的方法,在每种方法中,有一个NSURLSessionDataTask

我想以这三种方法串行执行的方式来塑造我的代码。因为,方法B取决于方法A的响应,方法C取决于方法B的响应。每个方法在获得API响应后也会执行一些数据库操作。所以,我需要连续执行methodAmethodBmethodC

我知道这是合乎逻辑的事情,但我想使用dispatch_semaphore_tdispatch_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 个答案:

答案 0 :(得分:2)

你在主队列中使用那些吗?不要在与dispatch_semaphore_wait相同的队列中运行回调块,因为dispatch_semaphore_wait将阻塞队列并且不会执行回调,这将导致死锁。