美文网首页
GCD之信号量

GCD之信号量

作者: 小羊爱学习 | 来源:发表于2020-05-13 19:21 被阅读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失败!");
            }];
        });
    }
    

    相关文章

      网友评论

          本文标题:GCD之信号量

          本文链接:https://www.haomeiwen.com/subject/vzyonhtx.html