多线程多任务顺序执行

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");
    });

看一下控制台结果
多线程多任务顺序执行_第1张图片
通过打印看到线程是顺序执行的

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

你可能感兴趣的:(多线程GCD)