1.全局队列和主队
dispatch_queue_get_main_queue();
dispatch_queue_get_global_queue(0,0);
2.串行队列和并行队列
串行队列
dispatch_queue_t serial = dispatch_queue_create("queue.com",NULL);
并行队列
dispatch_queue_t concurren = dispatch_queue_create("queue.com",DISPATCH_QUEUE_CONCURRENT);
3.多个线程子任务完成后再执行某一个任务,GCD线程组
dispatch_queue_t concurrent = dispatch_queue_create("queue.com",DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t groupGCD = dispatch_group_create();
dispatch_group_async(groupGCD,concurrent,^{
//子线程1;
});
dispatch_group_async(groupGCD,concurrent,^{
//子线程2;
});
第一种方式:
dispatch_group_notify(groupGCD,concurrent,^{
//目前在子线程中
dispatch_async(dispatch_get_global_queue(0,0),^{
//回到主线程
dispatch_async(dispatch_get_main_queue(),^{
//
});
});
});
第二种方式
在每一个子线程中添加
dispatch_group_enter(groupGCD);
dispatch_group_leave(groupGCD);
/*
使用 dispatch_group_enter(grpupT);来解决,dispatch_group_enter 和 dispatch_group_leave 必须要成对出现;
dispatch_group_enter : 使用一种手动的方式将另外一个 block 以不同于 dispatch_group_async 的方式添加到线程组中。在异步任务开始之前调用;
dispatch_group_leave : 手动指示一个 block 块执行完毕。以一种不用于 dispatch_group_async 的方式离开线程组,在异步任务执行完成之后调用;
*/
dispatch_group_async(groupGCD,concurrent,^{
dispatch_group_enter(groupGCD);
dispatch_async(dispatch_get_global_queue(0,0),^{
//子线程1
dispatch_group_leave(groupGCD);
});
});
dispatch_group_async(groupGCD,concurrent,^{
dispatch_group_enter(groupGCD);
dispatch_async(dispatch_get_global_queue(0,0),^{
//子线程2
dispatch_group_leave(groupGCD);
});
});
dispatch_group_notify(groupGCD,concurrent,^{
//回到主线程
dispatch_async(dispatch_get_main_queue(),^{
});
});
4.一次执行 和 延后执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{NSLog(@"执行延迟操作");});
dispatch_once_t once;
dispatch_once(&once,^{
});
网友评论