dispatch_async 与dispatch_sync的区别
来源:互联网 发布:软件运行乱码 编辑:程序博客网 时间:2024/04/29 09:14
**同步和异步关注的是消息通信机制 (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后执行.
* 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
* 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用.
**简单的生活中的例子就是:**
* 同步: 你打电话问书店老板有没有 **<<多线程编程>>** 这本书,如果是同步通信机制.书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是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异步继续执行。
0 0
- dispatch_async 与dispatch_sync的区别
- dispatch_async 和 dispatch_sync 的区别
- dispatch_sync和dispatch_async的区别
- GCD dispatch_async 与dispatch_sync 的理解
- dispatch_sync与dispatch_async
- dispatch_async和dispatch_sync在dispatch_get_main_queue上的区别
- dispatch_sync dispatch_async有什么区别?通熟易懂的解释
- GCD dispatch_sync和dispatch_async
- dispatch_sync和dispatch_async
- dispatch_async & dispatch_sync理解
- dispatch_async 和dispatch_sync GCD
- GCD 中串行队列、并行队列、dispatch_sync、dispatch_async的关系
- GCD编程dispatch_sync(同步)和dispatch_async(异步)方式执行并发队列任务区别
- GCD学习(六) dispatch_async 和dispatch_sync
- GCD学习(六) dispatch_async 和dispatch_sync
- GCD 第一篇 dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f
- dispatch_async 与 dispatch_get_global_queue 的使用方法
- 完整详解GCD系列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f
- 接口测试
- throw和 throws的区别
- 再看APP安全
- 《大数据的冲击》
- 常见题目之n的阶乘末尾有多少个0
- dispatch_async 与dispatch_sync的区别
- numpy argsort排序函数
- JDBC数据库的连接基本知识点
- 懒汉式单例模式的多线程问题
- opencv例程解读——dft(离散傅里叶变换)
- HttpWebRequest用法
- PAT(甲级)1077
- Android can not perform this action after onSaveInstanceState 问题解决
- 工厂模式实现仓储模版