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);
相关推荐
帅次7 小时前
Flutter 输入组件 Radio 详解
android·flutter·ios·kotlin·android studio
10年iOS老兵8 小时前
如何减少应用的启动时间
ios
开开心心就好9 小时前
高效PDF翻译解决方案:多引擎支持+格式零丢失
android·java·网络协议·tcp/ip·macos·智能手机·pdf
sean90812 小时前
处理 macOS 终端打开时会卡在 xcodebuild
macos
spencer_tseng16 小时前
MAC terminal
macos
zhujiaming16 小时前
iOS开发列表选中问题排查解决
前端·ios
帅次17 小时前
Flutter 输入组件 Checkbox 详解
android·flutter·ios·kotlin·android studio
胖大和尚18 小时前
在 macOS 上安装 coc.nvim(推荐方式)
macos
阿汤哥的程序之路1 天前
Java 安装开发环境(Mac Apple M1 Pro)
java·python·macos
二流小码农1 天前
鸿蒙开发:正则中的match和matchAll
android·ios·harmonyos