1.创建异步线程
NSLog(@"hello world 1");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(1);
NSLog(@"hello world 2");
});
NSLog(@"hello world 3");
屏幕快照 2017-09-28 下午3.11.55.png
2.创建同步线程
NSLog(@"hello world 1");
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
sleep(1);
NSLog(@"hello world 2");
});
NSLog(@"hello world 3");
屏幕快照 2017-09-28 下午3.11.27.png
3.创建主线程
dispatch_async(dispatch_get_main_queue(), ^{
//刷新界面代码
});
4.GCD只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//只执行一次代码
});
5.线程延迟调用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"## 在主线程延迟5秒调用 ##");
});
6.信号量
dispatch_semaphore_create //创建一个semaphore 通过dispatch_semaphore_create 函数创建一个Semaphore并初始化信号的总量。
dispatch_semaphore_signal //发送一个信号 通过dispatch_semaphore_signal 函数发送一个信号,让信号总量加1。
dispatch_semaphore_wait //等待信号 通过dispatch_semaphore_wait可以使总信号量减1,当信号总量为0时就会一直等待,否则就可以正常执行
dispatch_semaphore_t semaoh = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//获取数据 执行信号数量+1
dispatch_semaphore_signal(semaoh);
});
//使总信号量减1
dispatch_semaphore_wait(semaoh, DISPATCH_TIME_FOREVER);
7.多个请求都结束后,在执行界面刷新
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//创建组
dispatch_group_t group=dispatch_group_create();
// 关联一个任务到group
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//任务一
NSLog(@"******执行任务一******");
});
// 关联一个任务到group
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//任务二
NSLog(@"******执行任务二******");
});
// 等待组中的任务执行完毕,回到主线程执行block回调
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//任务三 回到主线程刷新界面
dispatch_async(dispatch_get_main_queue(), ^{
//刷新界面代码
});
});
8. dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
dispatch_queue_t queue = dispatch_queue_create("create_asy_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"任务一");
});
dispatch_async(queue, ^{
NSLog(@"任务二");
});
dispatch_barrier_async(queue, ^{
NSLog(@"dispatch_barrier_async");
//FIXEM:任务一和二都执行完了,才执行
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"刷新界面");
});
});
dispatch_async(queue, ^{
//FIXEM:界面刷新完了,才执行
[NSThread sleepForTimeInterval:1];
NSLog(@"任务三");
});
网友评论