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,表示从现在开始。
那么第二个参数就是真正的延时的具体时间。
-
NSEC_PER_SEC,每秒有多少纳秒。
-
USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)
-
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_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只有一份实例。
- +(SchoolManager *)sharedInstance
- {
- static SchoolManager *sharedManager;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedManager = [[SchoolManager alloc] init];
- });
- return sharedManager;
- }