全局并发队列参数解析
获取全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
参数解析
- 参数1涉及系统适配
iOS 8.0 服务质量
QOS_CLASS_USER_INTERACTIVE 用户交互(希望线程快速执行,不要放一些耗时操作)
QOS_CLASS_USER_INITIATED 用户需要的(不要放一些耗时操作)
QOS_CLASS_DEFAULT 默认
QOS_CLASS_UTILITY 使用工具(用来耗时操作)
QOS_CLASS_BACKGROUND 后台
QOS_CLASS_UNSPECIFIED 没有指定优先级
>iOS 7.0 调度优先级
>**************
>DISPATCH_QUEUE_PRIORITY_HIGH 高优先级
>DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认优先级
>DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级
>DISPATCH_QUEUE_PRIORITY_BACKGROUND 后台优先级
- 参数2:未来的保留参数
提示
其不要选择BACKGROUND ,线程执行会慢到令人发指!
延时处理
gcg延时处理
//你用多线程的方式来写一个延时处理!
/*
when?
queue?
block?
*/
dispatch_time_t when =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
dispatch_after(when, dispatch_queue_create("LYJ_GCD", NULL)//默认是主队列 ,可以自己创建一个串行队列
, ^{
NSLog(@"%@",[NSThread currentThread]);
});
NSObject延时处理
[self performSelector:@selector(run) withObject:nil afterDelay:1.0];
NSTimer延时处理
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(test) userInfo:nil repeats:NO];
GCD单例模式
- 单例的作用
可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问
从而方便地控制了实例个数,并节约系统资源
- 单例模式的使用场合
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)
- 代码
NSLog(@"来了");
//苹果提供的一次性机制,不仅能够保证一次执行,而且线程安全的。多个队列也是只是执行一次
static dispatch_once_t onceTocken;
NSLog(@"%ld",onceTocken);
dispatch_once(&onceTocken, ^{
NSLog(@"执行了%@",[NSThread currentThread]);
});
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
CGD快速迭代
使用dispatch_apply函数能进行快速迭代遍历
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index){
// 执行10次代码,index顺序不确定
});
GCD调度组
有这么1种需求
首先:分别异步执行2个耗时的操作
其次:等2个异步操作都执行完毕后,再回到主线程执行操作
使用调度组,可以高效地实现上述需求
//1.队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//2.调度组
dispatch_group_t g = dispatch_group_create();
//3.添加任务,将队列调度任务。任务完的时候,能够提醒!
dispatch_group_async(g, q, ^{
NSLog(@"download A %@",[NSThread currentThread]);
});
dispatch_group_async(g, q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download B %@",[NSThread currentThread]);
});
dispatch_group_async(g, q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download C %@",[NSThread currentThread]);
});
//4.当所有任务执行完毕后,通知
dispatch_group_notify(g, dispatch_get_main_queue(), ^{
//更新UI,通知用户
NSLog(@"OK %@",[NSThread currentThread]);//1
});
NSLog(@"come here");
dispatch_barrier_async
毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行,该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用
/同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用
dispatch_queue_t queue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4-----%@", [NSThread currentThread]);
});
结果为
1 2 --> barrier -->3 4 其中12 与 34 由于并行处理先后顺序不定