/**
* dispatch_after 从现在开始经过多少纳秒之后,由队列调度任务
* when 从现在开始经过多少纳秒之后
* queue dispatch_get_main_queue(),
* block "异步"任务
*/
dispatch_time_t when =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 *NSEC_PER_SEC));
dispatch_after(when,dispatch_get_main_queue(), ^{
NSLog(@"%@", [NSThreadcurrentThread]);
});
打印结果:
2015-07-02 16:07:58.300 gcd_test[1385:91601] <NSThread: 0x7be4b9f0>{number = 1, name = main}
/**
* dispatch_after 从现在开始经过多少纳秒之后,由队列调度任务
* when 从现在开始经过多少纳秒之后
* queue dispatch_get_global_queue(0, 0)(并发队列)
* block "异步"任务
*/
dispatch_time_t when =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 *NSEC_PER_SEC));
dispatch_after(when,dispatch_get_global_queue(0,0), ^{
NSLog(@"%@", [NSThreadcurrentThread]);
});
打印结果:
2015-07-02 16:09:39.402 gcd_test[1409:92593] <NSThread: 0x79764580>{number = 2, name = (null)}
/**
* dispatch_after 从现在开始经过多少纳秒之后,由队列调度任务
* 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("串行",NULL), ^{
NSLog(@"%@", [NSThreadcurrentThread]);
});
打印结果:2015-07-02 16:12:06.095 gcd_test[1429:93621] <NSThread: 0x7864e900>{number = 2, name = (null)}
得出结论,dispatch_after是执行异步任务
/分组
//案例:譬如要下载四本小说,最后全部下载完成之后,通知用户。
//创建一个任务组,可以在任务组中指定队列派发任务
//任务组,是可以跨队列的,所有的异步任务完成后,在主线程跟新UI
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, q, ^{
NSLog(@"下载 小说1 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"下载 小说2 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"下载 小说3 %@", [NSThread currentThread]);
});
dispatch_group_async(group, q, ^{
NSLog(@"下载 小说4 %@", [NSThread currentThread]);
});
//给任务组添加通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部小说下载完成 %@", [NSThread currentThread]);
});
//dispatch_once 一次性执行
//在程序开发中,通常有些代码只希望执行一次,例如“重要的初始化”,单例设计模式
//onceToken是保存在静态区的,如果是0,就执行block
//dispatch_once是线程安全的
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//要执行一次的代码
});