dispatch_async 与dispatch_sync的区别

**同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)**

* 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
* 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用.

**简单的生活中的例子就是:**

* 同步: 你打电话问书店老板有没有 **<<多线程编程>>** 这本书,如果是同步通信机制.书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果).这其中你电话不挂断.(等待返回结果).�接收不到返回结果,不继续下面的操作.
* 异步:书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果).你继续该干哈干哈.等老板然后查好了,他会主动打电话给你,在这里老板通过“回电”这种方式来回调.


应用到iOS的这两个函数中:

这两个函数都需要传递一个队列,和一个block参数. 对于`dispatch_async`来说.它把block放到队列中,之后立刻返回,继续往下执行. 对于`dispatch_sync`来说,我把block放到队列后,等待block执行完返回.我才继续往下执行.  

看下实际的代码:

//to show the difference of dispatch_async and dispatch_sync
//串行队列
dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);

//异步立刻返回.放打印放入到后台执行
dispatch_async(_serialQueue, ^{ NSLog(@"1");});

NSLog(@"2");

dispatch_async(_serialQueue, ^{ NSLog(@"3");});
NSLog(@"4");

//同步等待block的代码执行完.放打印放入到后台执行
dispatch_sync(_serialQueue, ^{ NSLog(@"1");});

NSLog(@"2");

dispatch_sync(_serialQueue, ^{ NSLog(@"3");});
NSLog(@"4");

对于`dispatch_async`来说,把block提交到队列,立刻返回执行下一步.不等待block执行完毕.所以它的打印结果有很多中,譬如说`2413 或者 2143或者 1234`,但是1总在3前面.因为提交到的队列是`串行队列`,打印3总在打印1后执行.  

对于`dispatch_sync`来说,把block提交到队列,不立刻返回,它等待提交到队列的block执行完毕才继续向下执行.所以其执行结果只有一种: 1234.无论你运行多少次都会是这一种结果. 

dispatch_sync和 dispatch_async需要两个参数,一个是队列,一个是block,它们的共同点是block都会在你指定的队列上执行(无论队列是并行队列还是串行队列),不同的是dispatch_sync会阻塞当前调用GCD的线程直到block结束,而dispatch_async异步继续执行。

你可能感兴趣的:(ios学习笔记)