GCD的理解

1.这篇介绍比较基础,简单明了

http://www.cnblogs.com/wendingding/p/3806821.html

2.这篇文章研究了GCD,着重讲了GCD的坑

http://www.cocoachina.com/ios/20150505/11751.html


同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);



延迟执行任务dispatch_after(queue);


dispatch_time_t dispatch_time ( dispatch_time_t when, int64_t delta );

第一个参数一般是DISPATCH_TIME_NOW,表示从现在开始。

那么第二个参数就是真正的延时的具体时间。

  1. NSEC_PER_SEC,每秒有多少纳秒。

  2. USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)

  3. NSEC_PER_USEC,每毫秒有多少纳秒。



例子:

//5 秒以后提交block
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{
     NSLog(@ "After..." );
});


//挂起队列
dispatch_suspend(queue);

//恢复队列            
dispatch_resume(queue);


“同步”的dispatch_apply

dispatch_apply的作用是在一个队列(串行或并行)上“运行”多次block,其实就是简化了用循环去向队列依次添加block任务。

dispatch_apply 会“等待”其所有的循环运行完毕才往下执行;嵌套使用容易导致死锁


//异步添加任务

dispatch_group_enter(group);

//异步结束任务

dispatch_group_leave(group);



//----------------------------

同步和异步决定了要不要开启新的线程

同步:在当前线程中执行任务,不具备开启新线程的能力

异步:在新的线程中执行任务,具备开启新线程的能力

 

并发和串行决定了任务的执行方式

并发:多个任务并发(同时)执行

串行:一个任务执行完毕后,再执行下一个任务



使用dispatch_queue_create函数创建串行队列dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);// 串行队列DISPATCH_QUEUE_SERIAL 并行队列 DISPATCH_QUEUE_CONCURRENT

主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行

使用dispatch_get_main_queue()获得主队列


使用dispatch_get_global_queue函数获得全局的并发队列

dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);

说明:全局并发队列的优先级

#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_once_t只有一份实例。

  1. +(SchoolManager *)sharedInstance  
  2. {  
  3.     static SchoolManager *sharedManager;  
  4.       
  5.     static dispatch_once_t onceToken;  
  6.     dispatch_once(&onceToken, ^{  
  7.         sharedManager = [[SchoolManager alloc] init];  
  8.     });  
  9.       
  10.     return sharedManager;  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值