1、dispatch_queue_create
第一个参数是队列名,第二个参数是队列的属性(优先级、执行顺序)
系统默认就有一个串行队列main_queue和并行队列global_queue
2、
dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t mainQ = dispatch_get_main_queue();
也可以手动创建一个串行、并行队列
dispatch_queue_t myQueue = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
(老版本用NULL代替DISPATCH_QUEUE_SERIAL)
dispatch_queue_t myQueue = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
3、
在global_queue中做一些long-running的任务,完成后在main_queue中更新UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// long-running task
dispatch_async(dispatch_get_main_queue(), ^{
// update UI
});
});
dispatch_sync 程序会暂停,等block执行完成才会继续。
dispatch_async 程序直接就过了。
4、监听一组任务是否完成,完成后得到通知
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:6];
NSLog(@"group1 [NSThread sleepForTimeInterval:6];");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"group2 [NSThread sleepForTimeInterval:3];");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"group3 [NSThread sleepForTimeInterval:1];");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"main thread.");
});
dispatch_release(group);
5、在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
应用场景:多个并发的时候,写操作必须是单独进行的,可以用这个。
dispatch_barrier_async的顺序执行还是依赖queue的类型啊,queue的类型必须为dispatch_queue_create创建
6、
dispatch_apply(5, globalQ, ^(size_t index) {
// 执行5次
});
7、dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once
});
8、不是延时执行,是延迟提交到队列
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
9、设定给定对象的目标队列
比如说有两个队列dispatchA和dispatchB,这时把dispatchA指派到dispatchB:
dispatch_set_target_queue(dispatchA, dispatchB);
那么dispatchA上还未运行的block会在dispatchB上运行。
10、暂停、恢复队列
这时如果暂停dispatchA运行:dispatch_suspend(dispatchA);
则只会暂停dispatchA上原来的block的执行,dispatchB的block则不受影响。而如果暂停dispatchB的运行,则会暂停dispatchA的运行。
dispatch_resume(dispatchA);
恢复队列
11、
dispatch_get_current_queue()获取当前队列
dispatch_queue_get_label()获取队列的名字,如果队列没有名字,返回NULL