今天记录一下 GCD中
dispatch_sync
dispatch_async
dispatch_after
dispatch_once
dispatch_group
如果你想知道他们是什么? 既然你诚心诚意的发问了, 我就大发慈悲的告诉你!
首先我们先了解几个概念
队列
队列分串行和并行,
串行 就是任务需要按照一定顺序执行, 例如 J, Q, K, A 四个事件, 按照顺序执行, 后面的需要等待前面的任务完成才能执行, 所以结束顺序是JQKA
并行 就是任务之间互相不干涉, 同时执行, 例如 J, Q, K, A 四个事件, 同时执行, 无等待, 所以结束顺序是随机的
dispatch_sync (同步执行): 使用 dispatch_sync 调用一个block, 这个block放在指定的queue1上执行, 但会等到block执行完毕才返回, 期间阻塞当前调用的 dispatch_sync 或 dispatch_async代码的queue, 直到 sync 函数返回。
dispatch_async (异步执行): 使用 dispatch_async 调用一个block, 这个block放在指定的queue2队尾等待执行, 至于这个block是被并行还是串行执行,只和dispatch_async中的指定的queue_1有关,但是dispatch_async会马上返回。用于对某个线程进行异步操作, 异步操作可以让我们不阻塞线程的情况下, 充分利用不同线程和队列来处理任务。
举一个生动的例子:
dispatch_sync (同步) 就相当于给客服打电话, 客服说稍等请不要挂断, 然后处理你的问题, 这期间你不能再打其他电话, 直到你这边问题处理完挂断, 你才可以继续给别人打电话
dispatch_async (异步) 就相当于给客服打电话, 客服说已收到你的问题, 先挂断, 之后返打给你, 然后你这边问题就可以处理其他电话, 等着客服返回打给你就可以
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"1");
});
NSLog(@"2");
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"3");
});
NSLog(@"4");
打印结果:
1 2 3 4
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"1");
});
NSLog(@"2");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"3");
});
NSLog(@"4");
每次可能都不一样, 具体看异步返回速度, 不过 2肯定在4 前面
打印结果:
2 1 4 3
或
2 4 1 3
或
....
可以看出,
dispatch_sync 等待block执行完毕后才接着执行后面的代码
dispatch_async 不需等待block执行完毕, 立即执行后面的代码
接下来我们看一种特殊情况
在主线程中调用
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"1");
});
网友评论