1.創(chuàng)建異步線(xiàn)程
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.創(chuàng)建同步線(xiàn)程
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.創(chuàng)建主線(xiàn)程
dispatch_async(dispatch_get_main_queue(), ^{
//刷新界面代碼
});
4.GCD只執(zhí)行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//只執(zhí)行一次代碼
});
5.線(xiàn)程延遲調(diào)用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"## 在主線(xiàn)程延遲5秒調(diào)用 ##");
});
6.信號(hào)量
dispatch_semaphore_create //創(chuàng)建一個(gè)semaphore 通過(guò)dispatch_semaphore_create 函數(shù)創(chuàng)建一個(gè)Semaphore并初始化信號(hào)的總量。
dispatch_semaphore_signal //發(fā)送一個(gè)信號(hào) 通過(guò)dispatch_semaphore_signal 函數(shù)發(fā)送一個(gè)信號(hào),讓信號(hào)總量加1。
dispatch_semaphore_wait //等待信號(hào) 通過(guò)dispatch_semaphore_wait可以使總信號(hào)量減1,當(dāng)信號(hào)總量為0時(shí)就會(huì)一直等待,否則就可以正常執(zhí)行
dispatch_semaphore_t semaoh = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//獲取數(shù)據(jù) 執(zhí)行信號(hào)數(shù)量+1
dispatch_semaphore_signal(semaoh);
});
//使總信號(hào)量減1
dispatch_semaphore_wait(semaoh, DISPATCH_TIME_FOREVER);
7.多個(gè)請(qǐng)求都結(jié)束后,在執(zhí)行界面刷新
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//創(chuàng)建組
dispatch_group_t group=dispatch_group_create();
// 關(guān)聯(lián)一個(gè)任務(wù)到group
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//任務(wù)一
NSLog(@"******執(zhí)行任務(wù)一******");
});
// 關(guān)聯(lián)一個(gè)任務(wù)到group
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//任務(wù)二
NSLog(@"******執(zhí)行任務(wù)二******");
});
// 等待組中的任務(wù)執(zhí)行完畢,回到主線(xiàn)程執(zhí)行block回調(diào)
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//任務(wù)三 回到主線(xiàn)程刷新界面
dispatch_async(dispatch_get_main_queue(), ^{
//刷新界面代碼
});
});
8. dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
dispatch_queue_t queue = dispatch_queue_create("create_asy_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"任務(wù)一");
});
dispatch_async(queue, ^{
NSLog(@"任務(wù)二");
});
dispatch_barrier_async(queue, ^{
NSLog(@"dispatch_barrier_async");
//FIXEM:任務(wù)一和二都執(zhí)行完了,才執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"刷新界面");
});
});
dispatch_async(queue, ^{
//FIXEM:界面刷新完了,才執(zhí)行
[NSThread sleepForTimeInterval:1];
NSLog(@"任務(wù)三");
});