iOS信号量的使用场景

作者: 幻想无极 | 来源:发表于2018-05-04 10:20 被阅读94次

多请求结束后统一操作

//多请求结束后统一操作
//例:如一个页面多个网络请求后刷新UI
- (void)test1 {
    //模拟并发后统一操作数据
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求1
        NSLog(@"Request_1");
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        //模拟网络请求
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"请求开始");
            sleep(2);
            NSLog(@"请求完成");
            //请求完成信号量+1,信号量为1,通过
            dispatch_semaphore_signal(sema);
        });
        NSLog(@"我是测试");
        //信号量为0,进行等待
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求2
        NSLog(@"Request_2");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求3
        NSLog(@"Request_3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //界面刷新
        NSLog(@"任务均完成,刷新界面");
    });
}

多请求顺序执行

//多请求顺序执行
//例:如第二个请求需要第一个请求的数据来操作
- (void)test2 {
    // 1.任务一:获取用户信息
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"Request_1");
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"请求1开始");
            sleep(3);
            NSLog(@"请求1完成");
            //请求完成信号量+1,信号量为1,通过
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }];
    
    // 2.任务二:请求相关数据
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"Request_2");
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"请求2开始");
            sleep(2);
            NSLog(@"请求2完成");
            //请求完成信号量+1,信号量为1,通过
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }];
    
    // 3.设置依赖
    [operation2 addDependency:operation1];// 任务二依赖任务一
    
    // 4.创建队列并加入任务
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperations:@[operation2, operation1] waitUntilFinished:NO];
}

group的enter和leave可以达到和1同样的效果

//enter leave
- (void)test3 {
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"Request_1");
        sleep(3);
        NSLog(@"Request1完成");
        dispatch_group_leave(group);
    });
    
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"Request_2");
        sleep(1);
        NSLog(@"Request2完成");
        dispatch_group_leave(group);
    });
    
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"Request_3");
        sleep(2);
        NSLog(@"Request3完成");
        dispatch_group_leave(group);
    });
    
    dispatch_group_notify(group,  dispatch_get_main_queue(), ^{
        
        NSLog(@"全部完成.%@",[NSThread currentThread]);
    });
}

相关文章

  • iOS信号量的使用场景

    多请求结束后统一操作 多请求顺序执行 group的enter和leave可以达到和1同样的效果

  • 信号量

    信号量的使用: 信号量使用的业务场景: 一、锁 YYKit加锁代码: 二、异步返回 三、控制并发量,降低性能。

  • iOS GCD信号量的使用

    iOS信号量主要用于GCD对线程安全的控制其中有三个主要的函数 使用场景 主要是控制线程并发数 比如 上面的代码只...

  • Semaphore

    信号量,最多可以有多少线程去执行。使用的场景:限流例如:卖票窗口,收费高速口等

  • 线程同步

    1.dispatch_semaphore(信号量)的理解及使用2.iOS 多线程同步策略之-----锁NSLock...

  • iOS GCD中级篇 - dispatch_semaphore(

    转载自:iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用理解这个概念之前,先抛...

  • channel使用场景:信号量

    channel 的读/写相当于信号量的 P / V 操作,下面的示例程序中 channel 相当于信号量:

  • iOS 实现一个栈 使用数组 (二)

    iOS 实现一个栈 这个栈是线程安全的 线程的安全使用GCD的信号量 dispatch_semaphore_t ...

  • iOS进阶-GCD信号量-dispatch_semaphore_

    目录 GCD信号量概念 使用API 实例使用 GCD信号量概念 使用API : dispatch_semaphor...

  • iOS底层--GCD应用

    手动目录GCD简介信号量信号量的理解信号量的使用信号量的代码实操信号量阻塞哪里的任务?栅栏函数dispatch_b...

网友评论

本文标题:iOS信号量的使用场景

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