欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程多任务顺序执行

程序员文章站 2022-05-05 21:37:02
...

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中的任务