多线程多任务顺序执行

ios开发中会用到多任务顺序执行,执行完毕在执行其他的线程任务,在面试中也会经常被问到,我这里就将方法代码记录下来作为一个笔记
我这里将通过信号量和GCD的Group实现多任务顺序执行
1.通过信号量来实现

//通过模拟一个网络请求来实现一个有返回值的网络请求任务
 NSString *str = @"https://www.baidu.com";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSession *session = [NSURLSession sharedSession];

    dispatch_semaphore_t sem = dispatch_semaphore_create(0); //创建信号量为0

    //模拟执行10个线程任务
    for (int i = 0; i < 10; i++) {

        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSLog(@"%d",i);
             dispatch_semaphore_signal(sem); 信号量加一
        }];

        [task resume];
        dispatch_semaphore_wait(sem,DISPATCH_TIME_FOREVER); //这个代表信号量减一 
    }
    //信号量只有在为0时才会继续执行下一步

    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"end");
    });

看一下控制台结果
这里写图片描述
通过打印看到线程是顺序执行的

2.使用Group实现

    NSString *str = @"https://www.baidu.com";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSession *session = [NSURLSession sharedSession];

  dispatch_queue_t queue = dispatch_queue_create("label", NULL); 
    dispatch_group_t group = dispatch_group_create();
    for (int i = 0; i < 10; i++) {


        dispatch_group_enter(group); //标志进入
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSLog(@"%d",i);

            dispatch_group_leave(group);//标志执行完离开
        }];
        [task resume];


    }

    //group中线程执行完成,通知执行下一步
    dispatch_group_notify(group, queue, ^{

        NSLog(@"end");
    });

这个group不一定会顺序执行,会在任务执行完成后才会执行dispatch_group_notify中的任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值