1 是基于 C 语言的底层 API
2 用 Block 定义任务,使用起来非常灵活便捷
3 提供了更多的控制能力以及操作队列中所不能使用的底层函数
GCD 的基本思想是就将操作 s 放在队列 s 中去执行, 具体操作 (即干什么) 使用 Blocks 定义, 而队列负责调度任务执行所在的线程以及具体的执行时间
队列 dispatch_queue_t 种类分为 4 种:
1 串行队列, 队列中得任务只会顺序执行
2 并行队列, 队列中得任务通常会并发执行
3 全局队列, 苹果公司为了方便, 提供了一个全局队列, 供所有的 app 使用, 其效果和并行队列几乎一样, 但是在调试的时候没有队列名称
4 主队列, 由于所有的 UI 更新都要在主线程上进行, 所以提供该队列
操作也分为两种:
1 异步操作 dispatch_async, 并发执行, 无法确定任务的执行顺序. 会创建新的线程
2 同步操作 dispatch_sync, 会依次执行, 可以决定任务的执行顺序, 不会创建新的线程
- //串行队列,异步任务,不会创建子线程,并且照顺序执行,由于和直接在主线程中使用一个效果,所以没有什么用处
- - (void) SerialQueueAsync {
- //创建串行队列 第一次参数的定义了这个线程的名字,第二个参数决定了这个队列的属性(串行/并行)
- dispatch_queue_t serial = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
- //异步操作
- for (int i = 0; i < 10; i++) {
- dispatch_async(serial, ^{
- NSLog(@"%@---%d", [NSThread currentThread], i);
- //输出结果num = 1 表示没有创建线程,注意,主线程的num = 1;
- });
- }
- //在非ARC的情况下需要注意释放内存
- // dispatch_release(serial);
- }
- //串行队列,同步任务,会创建一个子线程,并且照顺序执行,用处很大
- - (void) SerialQueuesync {
- //创建串行队列 第一次参数的定义了这个线程的名字,第二个参数决定了这个队列的属性(串行/并行)
- dispatch_queue_t serial = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
- //异步操作
- for (int i = 0; i < 10; i++) {
- dispatch_sync(serial, ^{
- NSLog(@"%@---%d", [NSThread currentThread], i);
- //输出结果num = 2 表示创建了一个线程,注意,主线程的num = 1;
- });
- }
- }
- //并行队列.异步执行,会创建多个线程,任务的运行先后顺序没有规律,无法控制
- - (void) concurrentQueueAsync {
- dispatch_queue_t concurrent = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);
- //异步操作
- for (int i = 0; i < 10; i++) {
- dispatch_async(concurrent, ^{
- NSLog(@"%@---%d", [NSThread currentThread], i);
- //输出结果num 有多个值,表示创建了多个线程,注意,主线程的num = 1;
- });
- }
- }
- //并行队列,同步执行
- - (void) concurrentQueueSync {
- dispatch_queue_t concurrent = dispatch_queue_create("123a", DISPATCH_QUEUE_CONCURRENT);
- //同步执行
- for (int i = 0; i < 10; i++) {
- dispatch_sync(concurrent, ^{
- NSLog(@"%@----%d", [NSThread currentThread], i);
- //num = 1 不会创建子线程
- });
- }
- }
- //并行队列容易出错,不能控制创建子线程数量,所以在开发中尽量使用串行队列,因为既可以控制创建子线程的个数,又可以保证执行的顺序
- //全局队列 (苹果公司为了方便多线程的设计,提供了一个全局队列,供所有的app使用)
- //运行效果和并发队列几乎一样,不过在调试的时候,全局队列没有名称,无法确认准确的队列
- - (void) globalQueue {
- dispatch_queue_t global = dispatch_get_global_queue( < span style = "color:#ff6666;" > DISPATCH_QUEUE_PRIORITY_DEFAULT < /span>, 0);/ / 这个优先级一定要使用默认的优先级, 否则可能会出现低优先级会阻塞高优先级任务
- for (int i = 0; i < 10; i++) {
- dispatch_async(global, ^{ //异步执行 创建了多个线程,任务的执行没有顺序
- NSLog(@"%@----%d", [NSThread currentThread], i);
- //num = 1 不会创建子线程
- });
- }
- }
- //主线程队列,在主线程执行
- //为什么需要在主线程上工作?--> 由于在iOS开发中,所有的UI更新都要在主线程上执行
- - (void) mainQueue {
- dispatch_queue_t main = dispatch_get_main_queue();
- // dispatch_sync(main, ^{//被阻塞
- // NSLog(@"come here");
- // });
- for (int i = 0; i < 10; i++) {
- dispatch_async(main, ^{
- NSLog(@"%@----%d", [NSThread currentThread], i);
- //num = 1 不会创建子线程
- });
- }
- }
- //在主线程队列中只能使用异步操作,如果使用同步操作,将会被阻塞,原因是,主线程在不停的运行监听事件,除非这个应用被推出,否则主线程将会一直执行任务,此时如果使用同步操作的话,同步操作中得任务将一直等待下去,将永远不会执行
来源: http://lib.csdn.net/article/ios/43482