GCD对于刚入门的程序猿猴来说乍看很神秘的样子,其实只要掌握了他的原理,就像我们用某个控件的代理方法一样简单。
摘自网上资料:
GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。
通过与线程池的配合,dispatch queue分为下面两种:
- Serial Dispatch Queue -- 线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始。
- Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。
我们可以通过dispatch_queue_cretae来创建队列,然后用dispatch_release释放。比如下面两段代码分别创建串行队列和并行队列:
- dispatch_queue_t serialQ = dispatch_queue_create("eg.gcd.SerialQueue", DISPATCH_QUEUE_SERIAL);
- dispatch_async(serialQ, ^{
- // Code here
- });
- dispatch_release(serialQ);
- dispatch_queue_t concurrentQ = dispatch_queue_create("eg.gcd.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
- dispatch_async(concurrentQ, ^{
- // Code here
- });
- dispatch_release(concurrentQ);
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- // long-running task
- dispatch_async(dispatch_get_main_queue(), ^{
- // update UI
- });
- });
2.dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- // code to be executed once
- });
3.有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用dispatch_after这个函数:
- double delayInSeconds = 2.0;
- dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
- dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
- // code to be executed on the main queue after delay
- });