//
// 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