GCD学习二
一。队列有哪几种呢?
1.1、自定义的队列 :dispatch_queue_create
1.2、系统自带的队列:
1.2.1、主队列 Main Dispatch Queue
1.2.2、全局队列 Global Dispatch Queue (3个优先级+I/O)
注意:在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中。
1.1、自定义队列
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
第一个参数是队列的名称,要易懂
第二个参数:NULL表示串行队列,DISPATCH_QUEUE_CONCURRENT表示并行队列
注意:同步队列可生成任意多个,并放到异步线程执行的时候,如果个数太多,会出现内存大量消耗,影响性能。要控制队列个数。如图:
那什么时候该使用同步线程呢?当出现并发队列竞争同一个资源的时候,我们可以用同步线程去控制。
1.2、系统自带的队列
1、Main Dispatch Queue:
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
dispatch_async((mainDispatchQueue,^{//主线程处理}));
该方法的处理与NSObject类的performSelectorOnMainThread实例方法一样。
2、Global Dispatch Queue
dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
第一个参数有四种:都是并行队列
DISPATCH_QUEUE_PRIORITY_DEFAULT 默认等级
DISPATCH_QUEUE_PRIORITY_HIGH 最高等级
DISPATCH_QUEUE_PRIORITY_LOW 最低等级
DISPATCH_QUEUE_PRIORITY_BACKGROUND 后台运行,更低等级
第二个参数:一般是0
一般代码执行:
dispatch_async((dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
//可并行执行处理代码
// 在main dispatch queue中执行block
dispatch_async(dispatch_get_main_queue(),^{
// 只能在主线程中执行处理
});
}));