需求:有5个任务.前两个 同时执行, 后两个也同时执行
异步函数 + 并发队列
因为并发队列执行的时候,是没有顺序的,所以才会有前两个任务同时执行完毕之后在执行第三个耗时操作,想要确保第一个和第二个耗时操作执行完之后就执行第三个操作,这看似是需要串行执行,但是在没有串行的时候,就需要其他的办法,比如在第三条线程添加一个阻塞函数,把第三个线程添加到阻塞函数里面,这样的话,后面的任务就只有等第三个任务执行完之后再继续执行第四五个操作
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 有5个任务. 前两个 同时执行, 后两个也同时执行.
// 中间的任务必须等待前两个任务执行完毕之后,再执行.
// 后两个任务必须等待第三个任务执行完毕之后再执行.
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 创建一个并发队列
dispatch_queue_t queue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT);
//dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 阻塞式函数,只有在自己创建的并发队列中才有效,对于全局并发队列,没有效果.
dispatch_async(queue, ^{
NSLog(@"renwu1:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:5];
});
dispatch_async(queue, ^{
NSLog(@"renwu2:%@",[NSThread currentThread]);
});
// 阻塞式函数
// 阻塞式函数,必须等待它之前的任务执行完毕之后,再执行阻塞式函数中的任务.
// 只有等到阻塞式函数中的任务执行完毕之后,再执行后续任务.
dispatch_barrier_async(queue, ^{
NSLog(@"renwu3:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:3];
});
dispatch_async(queue, ^{
NSLog(@"renwu4:%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"renwu5:%@",[NSThread currentThread]);
});
}
@end