1.简介
GCD,Grand Central Dispatch,开发者要做的只是1定义想执行的任务并2追加到适当的Dispatch Queue中。
2.队列Queue
可以理解成几个任务(代码Block)在排队上WC,队伍的种类分成两种:1.Serial Dispatch Queue串行,2.Concurrent Dispatch Queue并行。
串行就是这些任务就只有一个WC,并行是有多个WC。
3.创建队列 dispatch_queue_create
dispatch_queue_t myQueue = dispatch_queue_create("com.test.serialQueue", DISPATCH_QUEUE_SERIAL);
函数的第一个参数是队列名称,调试时会用,不要重名,第二个参数是队列种类。
队列种类有两种:DISPATCH_QUEUE_SERIAL和DISPATCH_QUEUE_CONCURRENT。
4.使用队列(异步使用)
异步串行:使用异步串行队列即是生成了一个线程按顺序执行队列中的任务。
串行就好比一个WC,几个任务排队去,先排队的先去,FIFO,一次一个,当人不能两个任务一块进了。
//异步
//串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("com.test1.serialQueue",DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
NSLog(@"test 1");
});
dispatch_async(serialQueue, ^{
NSLog(@"test 2");
});
dispatch_async(serialQueue, ^{
NSLog(@"test 3");
});
dispatch_async(serialQueue, ^{
NSLog(@"test 4");
});
NSLog(@"test Main");
输出结果为:
2017-02-13 14:17:53.277 UIKitLearn[3937:137154] test Main
2017-02-13 14:17:53.277 UIKitLearn[3937:137199] test 1
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 2
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 3
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 4
异步并行:使用异步并行,即是创建多个线程去并列执行队列中的任务,创建的线程数并不一定等于队列中的任务数,因为硬件系统限制,线程数量不是无限多的。
就好比几个任务上WC,一个有仨WC,当然会排成3个线程了。
//异步
//并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.test2.serialQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
NSLog(@"test 1");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 2");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 3");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 4");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 5");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 6");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 7");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"test 8");
});
NSLog(@"test Main");
输出结果为:
2017-02-13 14:31:01.195 UIKitLearn[4110:143827] test 2
2017-02-13 14:31:01.195 UIKitLearn[4110:143825] test 1
2017-02-13 14:31:01.195 UIKitLearn[4110:143839] test 3
2017-02-13 14:31:01.195 UIKitLearn[4110:143824] test 4
2017-02-13 14:31:01.195 UIKitLearn[4110:143914] test 5
2017-02-13 14:31:01.195 UIKitLearn[4110:143827] test 6
2017-02-13 14:31:01.195 UIKitLearn[4110:143825] test 7
2017-02-13 14:31:01.195 UIKitLearn[4110:143915] test 8
并不想串行那样按顺序执行,我们在中间打个断点:
这里就看到了我们生成的线程,这里要提一点的是,现在版本的iOS,GCD已经加入ARC,如果是老版本的,还要自己release创建的队列。
5.系统标准线程
上面提到的都是我们自己异步添加队列创建的线程,实际上系统会为我们提供几个线程:Main Dispatch Queue 和 Global Dispatch Queue。
Main Dispatch Queue是在主线程中执行的队列,获取方式:
//获取主线程队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
千万不要阻塞主线程,用户会干死你,老板会开除你,老婆会不要你。
Global Dispatch Queue,是所有应用程序都能够使用的Concurrent Dispatch Queue,其有4个优先级:最高优先级(High Priority),默认优先级(Default Priority),低优先级(Low Priority)和 后台优先级(Background Priority)。
dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(globalDispatchQueueLow, ^{
NSLog(@"low");
});
dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(globalDispatchQueueHigh, ^{
NSLog(@"high");
});
输出结果:
2017-02-13 14:46:13.973 UIKitLearn[4312:152074] high
2017-02-13 14:46:13.973 UIKitLearn[4312:152072] low