首页 > 代码库 > GCD,大家都知道的回顾

GCD,大家都知道的回顾

GCD,自iOS4.0吧,比block还要早,他的用处主要是体现在线程方面,比如你有个比较麻烦的而且循环比较大的代码段什么,比如有个后台下载什么的,这都必须放在子线程里一个放在子线程里执行,为了不影响用户体验!

来说说几个很基本的东西方便了解:

串行

系统默认就有一个串行队列main_queue,也就是主线程所在的队列,因为是串行,所以可以认为通过这个回到主线程

自定义dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
                            DISPATCH_QUEUE_CONCURRENT);(queueName 自定义的串行队列的名称)

执行一般是dispatch_get_main_queue()

 

 

并行

系统默认就有一个并行队列global_queue

自定义dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
                            DISPATCH_QUEUE_SERIAL);

关于并行,有个优先级的问题,看看系统给的,2,0 ,-2 和最小。。。

 

#define DISPATCH_QUEUE_PRIORITY_HIGH 2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

执行一般是dispatch_get_global_queue(这里是填优先级, 这个值可以看说明默认是0);

 

一般经常干的事是什么呢

dispatch_async(这里是并发, ^{

  // long-running task code here
        dispatch_async(这里是串行,^{

      //update UI code here

          });
    });

线程的延时操作

dispatch_time(DISPATCH_TIME_NOW(这个是以程序执行的时间点), seconds * NSEC_PER_SEC(这里是设定精确级别的));

dispatch_after(dispatch_time_t when(这个就是上面生成的一个time),dispatch_queue_t queue(队列),dispatch_block_t block(延迟执行的语句));

线程组

dispatch_group_create()创建一个组

可以用来监控一个group里的内容是否执行完成

dispatch_group_notify(dispatch_group_t group,

            dispatch_queue_t queue,

            dispatch_block_t block);

很奇特的GCD,不是么,group是一个个执行的,但是在这其中,不管你是并行或串行,根本就不会按你所想的规矩来,特别是并发的,当你加入一个group里面他可不会按你代码排的顺序来执行(包括串行),但是最终肯定会执行dispatch_group_notify参数里面的block语句。

GCD定时器

写成一个内联函数

NS_INLINE dispatch_source_t GCD_create_timer(int64_t seconds, dispatch_queue_t queue, void (^block)(dispatch_source_t timer))
{
    //创建Timer
   
    dispatch_source_t _timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
    //使用dispatch_source_set_timer函数设置timer参数
    dispatch_source_set_timer(_timer,
                                    dispatch_time(DISPATCH_TIME_NOW, 0),
                                    seconds * NSEC_PER_SEC,
                                    0);
      
    //设置回调
    dispatch_source_set_event_handler(_timer, ^(){
                                          block(_timer);
                                      });
    
    //dispatch_source默认是Suspended状态,通过dispatch_resume函数开始它
    dispatch_resume(_timer);
    return _timer;
}

用完记得释放,否则。。。。(ARC可以不考虑,看看里面的实现吧!)

 

至于同步的。。。你觉得这有讨论的必要么,好吧,我确实不知道同步用在那些地方!