OC — 信号量使用dispatch_semaphore

总结:使用dispatch_semaphore时,注意要在异步线程中,不要再主线程操作,容易造成阻塞。

/// 创建一个信号量为0
dispatch_semaphore_t sem = dispatch_semaphore_create(0);

/// 使信号量-1, 若信号量 < 0, 在DISPATCH_TIME_FOREVER下,会一直等待到信号量+1后才能继续执行后续操作。
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

/// 使信号量+1
dispatch_semaphore_signal(sem);

- (BOOL)returnResult {// 该方法可行。
    
    
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    
    __block BOOL a = false;

    NSLog(@"out a = %d",a);
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"3秒后");
            
            a = true;

            dispatch_semaphore_signal(sem);

        });
    // 此处需要配合 延迟中 异步线程 dispatch_get_global_queue 来使用,
    //否则,使用 main的话,会阻塞主线程。
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

    return a;// 会在 3秒后执行 return 操作。
}

- (void)testNumber {
    
    BOOL a = [self returnResult];
    
    NSLog(@"a = %d", a);// 3秒后打印 a = 1
}

dispatch_semaphore 的使用,不局限于线程的等待,还可以控制线程并发的数量,控制异步任务的执行顺序。此外并发数量的控制在NSOperation中也可以来控制。别人的优秀Case

你可能感兴趣的:(OC — 信号量使用dispatch_semaphore)