-1

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

我想以使这 3 种方法串行执行的方式来塑造我的代码。因为,方法 B 取决于方法 A 的响应,方法 C 取决于方法 B 的响应。每个方法在得到 API 响应后也会做一些数据库操作。所以,我需要串行执行methodA,methodBmethodC.

我知道这是合乎逻辑的事情,但我想使用dispatch_semaphore_tordispatch_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 *************");

上面的代码停留在第一种方法上。

4

1 回答 1

2

你在使用主队列中的那些吗?不要和dispatch_semaphore_wait在同一个队列中运行回调阻塞,因为dispatch_semaphore_wait会阻塞队列,回调不会被执行,会导致死锁。

于 2016-03-30T05:55:29.147 回答