GCD的简单介绍

一)GCD 的使用方式

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

async表明运行方式

queue则是你把任务交给那个线程队列来处理

block代表的是你要做的事情

//线程运行方式 

dispatch_async 异步执行

dispatch_sync  同步执行

dispatch_delay 延迟执行

...

二)处理任务对象 dispatch queue(线程队列) 

一、dispatch_get_main_queue  主线程队列(UI线程队列)

二、dispatch_get_global_queue 并行线程队列,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。

三、串行队列,一般用于按顺序同步访问,依次执行(顺序由代码先后觉得),可创建任意数量的串行队列,各个串行队列之间是并发的。

当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。

串行队列通过dispatch_queue_create创建,可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。

//dispatch queue叫线程队列

dispatch_queue_create 用于创建用户线程队列。可以创建Serial/Concurrent Dispatch Queue 两种队列,即串行与并行队列。

一、创建Serial Dispatch Queue。 

dispatch_queue_t serialQueue =  dispatch_queue_create (  "com.SerialQueue" , NULL ); 

可以创建多个串行队列,串行队列也可以并行执行。决不能随意的大量生产Serial Dispatch Queue。 

二、创建Concurrent Dispatch Queue 

dispatch_queue_t concurrentQueue =  dispatch_queue_create ( "com.ConcurrentQueue" , 

DISPATCH_QUEUE_CONCURRENT ); 

Concurrent Dispatch Queue不过创建多少都没有问题,因为Concurrent Dispatch Queue所使用的线程由系统的XNU内核高效管理,不会影响系统性能。 

三) 只执行一次的线程  一般用来写单例模式

static dispatch_once_t onceToken; 

dispatch_once (&onceToken, ^{ 

});

EG:

SubObject *subobject =  nil ; 

+ (  SubObject *)sharedRequest 

static dispatch_once_t onceToken; 

dispatch_once (&onceToken, ^{ 

subobject = [[  SubObject alloc ]  init ]; 

return subobject 

// 延迟2秒执行线程

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 

});

//线程汇总通知,等所有子线程(这个称呼不准确,先代替了)执行完成后,才执行notify线程

dispatch_group_t group = dispatch_group_create  ();

dispatch_group_async  (group, dispatch_get_global_queue  ( 0 , 0 ), ^{

// 并行执行的线程一 

for (  int i=  0 ; i<  10 ; i++) { 

NSLog (  @"---------%i" ,i); 

}

});

dispatch_group_async  (group, dispatch_get_global_queue  ( 0 , 0 ), ^{

// 并行执行的线程二 

for (  int i=  10 ; i<  20 ; i++) { 

NSLog (  @"+++++++++%i" ,i); 

}

});

dispatch_group_notify  (group, dispatch_get_global_queue  ( 0 , 0 ), ^{

// 汇总结果

NSLog (  @"完成" ); 

});

原文地址:https://www.cnblogs.com/changeUniversal/p/4645085.html