首页 > 代码库 > 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可以不考虑,看看里面的实现吧!)
至于同步的。。。你觉得这有讨论的必要么,好吧,我确实不知道同步用在那些地方!