当前位置: 首页 > news >正文

iOS:GCD信号量、同步、异步的使用方法

信号量的详细用法,可以用此方法进行队列管理
-(void)dispatchSignal{

    //crate的value表示,最多几个资源可访问
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //任务1
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
        dispatch_semaphore_signal(semaphore);
    });
    //任务2
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
        dispatch_semaphore_signal(semaphore);
    });
    //任务3
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });

}

队列组:
适用场景:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。
- (void)groupNotify {

    NSLog(@"currentThread---%@",[NSThread currentThread]);  // 打印当前线程
    NSLog(@"group---begin");
    
    dispatch_group_t group =  dispatch_group_create();
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
            NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
            NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
            NSLog(@"3---%@",[NSThread currentThread]);      // 打印当前线程
        }
        NSLog(@"group---end");
    });
}
//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// dispatch_async(queue, ^{
//
//
// });

//group的用法
APIHTTPService *httpService = [APIHTTPService sharedService];
__block NSError *blockError;
dispatch_group_t group = dispatch_group_create();

/* 先获取Token */
dispatch_group_enter(group);
[httpService fetchTokenWithCompletionHandler:^(NSString *token, NSError *error) {
    if (error) {
        NSLog(@"[MBStitchAPIService] Fetch token failed");
        blockError = error;
    }
    dispatch_group_leave(group);
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
http://www.dtcms.com/a/93663.html

相关文章:

  • Browserlist 使用指南:应对浏览器兼容性问题的解决方案
  • golang-互斥锁-mutex-源码阅读笔记
  • Maven工具学习使用(四)——仓库
  • 双工通信:WebSocket服务
  • Flink 常用及优化参数
  • 【NLP 49、提示工程 prompt engineering】
  • 海外紧固件市场格局与发展趋势研究报
  • 自定义创建中间件出现的ImproperlyConfigured: WSGI application错误的坑
  • 深度学习篇---断点重训模型部署文件
  • springboot在feign和线程池中使用TraceId日志链路追踪(最终版)-2
  • Windows10即将开始收费更新!每年费用61美元
  • 群核科技持续亏损近18亿:营销费用偏高,市场份额优势面临挑战
  • vue3 数据监听(watch、watchEffect)
  • 【前端】原生项目与框架项目区别
  • 每天认识一个设计模式-建造者模式:复杂对象的“装配式革命“
  • rabbitmq承接MES客户端服务器
  • React Native集成到原生iOS应用中
  • Keysight ADS教学 - 一维二維參數掃描(parameter sweep)
  • Appium Inspector使用教程
  • [算法笔记]一段数量变化的无序区间的中位数查找--双堆法
  • RabbitMQ 核心组件及功能详解
  • tar包部署mongo
  • 登录时图形校验
  • openstack连接云主机
  • MATLAB 控制系统设计与仿真 - 29
  • Java性能调优实战指南:从理论到实践
  • Linux 搭建dns主域解析,和反向解析
  • 联核防爆无人叉车:高危环境中的安全搬运守护者
  • Sentinel 限流利器(功能以及源码解析)
  • JavaScript的性能优化指导