多线程:调度组

本文通过实例演示了如何使用GCD(Grand Central Dispatch)进行组调度,包括如何创建队列和组,执行异步任务,并利用dispatch_group_notify进行通知机制的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self gcdDemo1];
}

- (void)gcdDemo {
    // 获取一个队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    // 创建一个组
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{
        // 来一组异步
        NSLog(@"下载电影A");
    });

    dispatch_group_async(group, queue, ^{
        // 来一组异步
        [NSThread sleepForTimeInterval:2];
        NSLog(@"下载电影B");

    });


    dispatch_group_async(group, queue, ^{
        // 来一组异步
        NSLog(@"下载电影C");
    });
    // NSNotification 通讯
    // window : 下载完关机
    dispatch_group_notify(group, queue, ^{
        NSLog(@"下载完成");
    });

}

// 调度组在工作中使用的并不多
- (void)gcdDemo1 {
    NSLog(@"start");
    /*
     dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
     {
     dispatch_retain(group);
     dispatch_group_enter(group); // 标记进入组
     dispatch_async(queue, ^{
     block(); // 执行任务
     dispatch_group_leave(group); // 离开组
     dispatch_release(group);
     });
     }
     */

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_group_t group = dispatch_group_create();

    /*
     dispatch_group_enter 跟 dispatch_group_leave 必须要成对出现,才可以获取到通知
     */
    // 进入组
    dispatch_group_enter(group);
    // 执行异步操作
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"下载文件A");// block
        // 离开级
        dispatch_group_leave(group);
    });


    dispatch_group_enter(group);
    // 执行异步操作
    dispatch_async(queue, ^{
//        [NSThread sleepForTimeInterval:1];
        NSLog(@"下载文件B");// block
        // 离开级
        dispatch_group_leave(group);
    });

    dispatch_group_notify(group, queue, ^{
        NSLog(@"下载完了");
    });

    // 同步等待多长时间 (网络请求,如果很长时间,请求不成功,超时)
    dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC));
    NSLog(@"end");
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值