天天看点

iOS 多线程 设定执行顺序

//

//  ViewController.m

//  GCDDownload

//

//  Created by ql on 2018/4/4.

//  Copyright © 2018年 carystaloptech. All rights reserved.

//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    [self DownloadFilesWithGCD];

}

//经常有这样的需求:

//1,有m个网络请求。

//2,先并发执行其中n几个。

//3,待这n个请求完成之后再执行第n+1个请求。

//4然后等 第n+1个请求完成后再并发执行剩下的m-(n+1)个请求。

- (void)DownloadFilesWithGCD{

    dispatch_queue_t queue = dispatch_queue_create("downQueue",DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{

        NSLog(@"gcd任务1");

        sleep(3);

    });

    dispatch_async(queue, ^{

        NSLog(@"gcd任务2");

        sleep(1);

    });

    dispatch_async(queue, ^{

        NSLog(@"gcd任务3");

        sleep(3);

    });

//void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

//这个函数可以设置同步执行的block,它会等到在它加入队列之前的block执行完毕后,才开始执行。在它之后加入队列的block,则等到这个block执行完毕后才开始执行。

    dispatch_barrier_async(queue, ^{

        NSLog(@"gcd处理任务 1 2 3");

    });

    dispatch_async(queue, ^{

        NSLog(@"gcd任务4");

        [self downloadFilesWithNSOperation];

    });

    dispatch_async(queue, ^{

        NSLog(@"gcd任务5");

        sleep(3);

    });

//    参考:http://www.cnblogs.com/sunfrog/p/3305614.html

}

- (void)downloadFilesWithNSOperation{

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"op任务1");

        sleep(5);

    }];

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"op任务2");

        sleep(2);

    }];

    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"op任务3");

        sleep(3);

    }];

    [op3 addDependency:op1]; // 添加依赖关系 op3 在 op1 完成以后执行

    [op3 addDependency:op2]; // 添加依赖关系 op3 在 op2 完成以后执行

    //设置队列中操作同时执行的最大数目,也就是说当前队列中呢最多由几个线程在同时执行,一般情况下允许最大的并发数2或者3

    [queue setMaxConcurrentOperationCount:3];

    [queue addOperations:@[op1,op2,op3] waitUntilFinished:YES];

    NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"op任务4");

        sleep(3);

    }];

    NSBlockOperation *op5 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"op任务5");

    }];

    NSOperationQueue *queue1 = [[NSOperationQueue alloc]init];

    [op4 addDependency:op3]; // 添加依赖关系 op4 在 op3 完成以后执行

    [op5 addDependency:op3]; // 添加依赖关系 op5 在 op3 完成以后执行

//    - (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait;

//批量加入执行operation,wait标志是否当前线程等待所有operation结束后,才返回

    [queue1 addOperations:@[op4,op5] waitUntilFinished:YES];

//    参考: http://www.jb51.net/article/130108.htm

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

继续阅读