GCD之信号量

2020-05-13  本文已影响0人  小羊爱学习

关于信号量的使用,我在csdn博客上几年前已经写过,这里不再重复
地址1:https://blog.csdn.net/qq_29892943/article/details/77717391
地址2:https://blog.csdn.net/qq_29892943/article/details/58132267

今天来探讨一下,信号量到底是在0时阻塞线程,还是在负值时阻塞线程:
上代码:

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    NSLog(@"1111");
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"222");

打印结果:


1111.png

很多人说信号量为0的时候阻塞线程,返回null,可是为什么这里还会打印111?而当dispatch_semaphore_wait时,这里的信号量-1,变成了-1,所以没有走222打印。所以,结果很明了了吧。

另外常用的组合:例如以下情况,分别执行两个异步的AFN网络请求,第二个网络请求需要等待第一个网络请求响应后再执行,使用信号量的实现:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSString *urlString1 = @"/Users/ws/Downloads/Snip20161223_20.png";
    NSString *urlString2 = @"/Users/ws/Downloads/Snip20161223_21.png";
    // 创建信号量
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        [manager POST:urlString1 parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"1完成!");
            // 发送信号量
            dispatch_semaphore_signal(sem);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"1失败!");
            // 发送信号量
            dispatch_semaphore_signal(sem);
        }];
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 等待信号量
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        
        [manager POST:urlString2 parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"2完成!");
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"2失败!");
        }];
    });
}
上一篇下一篇

猜你喜欢

热点阅读