- dispatch_after
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, ^(void)block)
when 时间间隔
queue 提交到的队列
block 执行的任务
使用如下:
dispatch_after(
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)),
dispatch_get_main_queue(),
^{
<#code to be executed after a specified delay#>
}
);
功能:延迟一段时间把一项任务提交到制定队列中执行,返回之后就不能取消
常用来在主队列上延迟执行一项任务
- dispatch_apply
dispatch_apply(size_t iterations, dispatch_queue_t queue, ^(size_t)block)
iterations 执行的次数
queue 提交到的队列
block 执行的任务
dispatch_apply(4, dispatch_get_global_queue(0, 0), ^(size_t index) {
NSLog(@"%zu",index);
});
NSLog(@"dispatch_apply done");
输出结果:
0
2
3
1
dispatch_apply done
输出结果索引执行顺序是不确定的,由于这样会阻塞主线程,而下文又与dispatch_apply的执行结果无关,所以可以在异步队列中使用dispatch_apply,然后执行完成后进行通知,如:
dispatch_async(dispatch_get_global_queue(0,0), ^{
dispatch_apply(4, dispatch_get_global_queue(0, 0), ^(size_t index) {
NSLog(@"%zu",index);
});
NSLog(@"dispatch_apply done");
});
NSLog(@"dispatch_apply done in main");
输出结果:
2
dispatch_apply done in main
0
3
1
dispatch_apply done
1 dispatch_apply, 作用是把指定次数指定的block添加到queue中,
第一个参数是迭代次数,第二个是所在的队列,第三个是当前索引,dispatch_apply可以利用多核的优势,所以输出的index顺序不是一定的强调内容
2 dispatch_apply 和 dispatch_apply_f 是同步函数,会阻塞当前线程直到所有循环迭代执行完成。当提交到并发queue时,循环迭代的执行顺序是不确定的
- dispatch_once
dispatch_once(dispatch_once_t *predicate, ^(void)block)
predicate 用来判断提交的block是否执行完成
block 执行一次的任务
dispatch_once 常见于使用在单例中,保证在APP运行期间,block中的代码只执行一次,如:
+ (instantClass *)sharedClient {
static instantClass *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[instantClass alloc] init];
});
return _sharedClient;
}