- 对同步、异步、串行、并行的执行顺序,之前总是模棱两可,今天写个Demo测试一下,废话不多说(其实也不会说),直接上测试代码
一、首先定义两个方法,一个同步执行相应代码,一个异步执行
//同步执行
- (void)syncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"start 1");
sleep(3);
NSLog(@"end 1");
});
NSLog(@"2");
dispatch_sync(queue, ^{
NSLog(@"start 2");
sleep(3);
NSLog(@"end 2");
});
NSLog(@"3");
dispatch_sync(queue, ^{
NSLog(@"start 3");
sleep(3);
NSLog(@"end 3");
});
NSLog(@"4");
dispatch_sync(queue, ^{
NSLog(@"start 4");
sleep(3);
NSLog(@"end 4");
});
NSLog(@"5");
if (barrer) {
dispatch_barrier_sync(queue, ^{
NSLog(@"barrier start 1");
sleep(3);
NSLog(@"barrier end 1");
});
NSLog(@"6");
dispatch_sync(queue, ^{
NSLog(@"start 5");
sleep(3);
NSLog(@"end 5");
});
NSLog(@"7");
}
}
//异步执行
- (void)asyncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
NSLog(@"1");
dispatch_async(queue, ^{
NSLog(@"start 1");
sleep(3);
NSLog(@"end 1");
});
NSLog(@"2");
dispatch_async(queue, ^{
NSLog(@"start 2");
sleep(3);
NSLog(@"end 2");
});
NSLog(@"3");
dispatch_async(queue, ^{
NSLog(@"start 3");
sleep(3);
NSLog(@"end 3");
});
NSLog(@"4");
if (barrer) {
dispatch_barrier_async(queue, ^{
NSLog(@"barrier start 1");
sleep(3);
NSLog(@"barrier end 1");
});
NSLog(@"5");
dispatch_async(queue, ^{
NSLog(@"start 4");
sleep(3);
NSLog(@"end 4");
});
NSLog(@"6");
}
}
二、在自行创建串行队列执行这两个方法
测试代码
//自行创建串行队列
dispatch_queue_t serialQueue=dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
//1.同步
[self syncTestWithQueue:serialQueue withBarrier:YES];
//2.异步
[self asyncTestWithQueue:serialQueue withBarrier:YES];
输出结果
syncTestWithQueue: withBarrier: asyncTestWithQueue: withBarrier:结论:
1.同步与异步block的执行顺序都是按顺序执行的,不同的是同步会阻塞线程,异步不会
2.dispatch_barrier,执行顺序 和 dispatch_sync与dispatch_async加入的block是一样的
三、主线程串行队列
测试代码
dispatch_queue_t mainSerialQueue=dispatch_get_main_queue();
//1.同步
//会阻塞,不用想了
[self syncTestWithQueue:mainSerialQueue withBarrier:YES];
//2.异步
[self asyncTestWithQueue:mainSerialQueue withBarrier:YES];
输出结果
asyncTestWithQueue: withBarrier:结论
同步会阻塞,异步和自行创建串行队列是一样的
四、自行创建并行队列
测试code
dispatch_queue_t concurrentQueue=dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
//1.同步
[self syncTestWithQueue:concurrentQueue withBarrier:YES];
//2.异步
[self asyncTestWithQueue:concurrentQueue withBarrier:YES];
输出
syncTestWithQueue: withBarrier: asyncTestWithQueue: withBarrier:结论
1.同步:由于会阻塞线程,所以并行与串行执行顺序是一样的
2.异步:所有block都会一起执行,dispatch_barrier执行时之后加入的block,会等待barrier执行完再执行
五、全局并行队列
测试code
dispatch_queue_t globalConcurrentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//1.同步
[self syncTestWithQueue:globalConcurrentQueue withBarrier:YES];
//2.异步
[self asyncTestWithQueue:globalConcurrentQueue withBarrier:YES];
输出
syncTestWithQueue: withBarrier: asyncTestWithQueue: withBarrier:结论
1.同步:与自行创建并发队列是一样的
2.异步:所有block都会一起执行,但是,dispatch_barrier执行时之后加入的block,不会等待barrier执行完再执行(dispatch_barrier不要用在全局并发队列里)
网友评论