Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想要执行的任务追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。
一、Dispatch Queue
- Serial Dispatch Queue,按添加进队列的顺序(先进先出)一个接一个的执行
- Concurrent Dispatch Queue,并发执行队列里的任务
//参数一:队列的名称,一般使用倒序的全域名(可选)有名称的队列有利于以后的调试
//参数二:队列的类型,当为nil时返回Serial Dispatch Queue,当为DISPATCH_QUEUE_CONCURRENT返回的是Concurrent Dispatch Queue
dispatch_queue_t myQueue =dispatch_queue_create("com.xxxx",nil);
dispatch_async(myQueue, ^{//也可用dispatch_asyns()
NSLog(@"thread1");
});
dispatch_queue_t myMainQueue =dispatch_get_main_queue();
dispatch_async(myMainQueue, ^{//必须用dispatch_async,如果用dispatch_async会发生死锁,因为:
//多用来执行更新ui操作
});
或者使用以下方式:
dispatch_async(dispatch_get_main_queue(), ^{//必须用dispatch_async
//多用来执行更新ui操作
});
dispatch_sync(myQueue, ^{//也可用dispatch_asyns()
NSLog(@"thread1");
});
dispatch_queue_t aQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_queue_t aHQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
dispatch_queue_t aLQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);
3、dispatch_async和dispatch_sync之间的区别
(1)async:当当前线程给子线程分配了block当中的任务之后,当前线程会立即执行,并不会发生阻塞,也就是异步的,程序的运行结果是不 可预知的
(2)sync:当主线程将任务分给子线程后,主线程会等待子线程执行完毕,再继续执行自身的内容