iOS--多线程之GCD(Grand Central Dispatch)
2017-03-27 00:00
393 查看
做一下整理,与大家分享,不足之处请留言:
GCD中最核心的是任务和队列,使用时要先创建任务,然后将任务添加到队列中。
创建任务时有两种方式:
同步:只能在当前线程中执行任务,不具备开启新线程的能力
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
异步:可以在新的线程中执行任务,具备开启新线程的能力
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
队列有两类:
并发队列(Concurrent Dispatch Queue)
可以让多个任务同时执行(自动开启多个线程同时执行任务)
并发功能只有在异步(dispatch_async)函数下才有效
串行队列(Serial Dispatch Queue)
让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
创建队列
创建并发队列
dispatch_queue_t queue = dispatch_queue_create("作用.queue", DISPATCH_QUEUE_CONCURRENT);
获取全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
创建串行队列
dispatch_queue_t queue = dispatch_queue_create("作用.queue", DISPATCH_QUEUE_SERIAL);
获取主队列:主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行
dispatch_queue_t queue = dispatch_get_main_queue();
从网上找的图,可以借鉴:
注:在使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列
线程之间的通信:获得全局的并发队列,并创建一个异步任务(开启一个新的子线程)执行耗时操作,完成 之后回到主线程,创建UI刷新界面
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// 执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执行UI刷新操作
}); });
dispatch_once: 在程序运行过程中只被执行1次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});
延时执行 1. [self performSelector:@selector(downLoad) withObject:nil afterDelay:3.0];
2. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 3秒后异步执行这里的代码... });
队列组 异步执行多个耗时的操作,都执行完毕后,再回到主线程执行操作
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});
GCD中最核心的是任务和队列,使用时要先创建任务,然后将任务添加到队列中。
创建任务时有两种方式:
同步:只能在当前线程中执行任务,不具备开启新线程的能力
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
异步:可以在新的线程中执行任务,具备开启新线程的能力
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
队列有两类:
并发队列(Concurrent Dispatch Queue)
可以让多个任务同时执行(自动开启多个线程同时执行任务)
并发功能只有在异步(dispatch_async)函数下才有效
串行队列(Serial Dispatch Queue)
让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
创建队列
创建并发队列
dispatch_queue_t queue = dispatch_queue_create("作用.queue", DISPATCH_QUEUE_CONCURRENT);
获取全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
创建串行队列
dispatch_queue_t queue = dispatch_queue_create("作用.queue", DISPATCH_QUEUE_SERIAL);
获取主队列:主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行
dispatch_queue_t queue = dispatch_get_main_queue();
从网上找的图,可以借鉴:
注:在使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列
线程之间的通信:获得全局的并发队列,并创建一个异步任务(开启一个新的子线程)执行耗时操作,完成 之后回到主线程,创建UI刷新界面
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// 执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执行UI刷新操作
}); });
dispatch_once: 在程序运行过程中只被执行1次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});
延时执行 1. [self performSelector:@selector(downLoad) withObject:nil afterDelay:3.0];
2. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 3秒后异步执行这里的代码... });
队列组 异步执行多个耗时的操作,都执行完毕后,再回到主线程执行操作
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});
相关文章推荐
- iOS多线程之Grand Central Dispatch 简称(GCD)
- iOS开发-多线程之GCD(Grand Central Dispatch)
- iOS多线程开发(五)---GCD(Grand Central Dispatch)
- iOS开发之四张图说明GCD(Grand Central Dispatch)附Test源码
- IOS开发--网络篇-->GCD(Grand Central Dispatch)的详解
- iOS多线程开发系列之(三)Grand Central Dispatch(GCD)
- iOS多线程GCD深入之Dispatch Group使用
- iOS多线程系列(四)----GCD之Dispatch Queues
- 聊聊iOS下block + GCD (Grand Central Dispatch)实现异步非阻塞
- Multithreading annd Grand Central Dispatch on ios for Beginners Tutorial-多线程和GCD的入门教程
- 聊聊iOS下block + GCD (Grand Central Dispatch)实现异步非阻塞
- iOS Grand Central Dispatch(GCD) 多线程编程概要与API
- iOS之[多线程:GCD:Dispatch]
- 多线程之GCD(Grand Central Dispatch)
- iOS线程开发之--BLOCK & GCD(Grand Central Dispatch)
- 聊聊iOS下block + GCD (Grand Central Dispatch)实现异步非阻塞
- IOS-12-关于GCD多线程:dispatch_async 与 dispatch_get_global_queue 的使用方法
- iOS(3)多线程编程技术(Thread Cocoa opreations GCD(Grand Central Dispatch ))
- iOS GCD(Grand Central Dispatch)的使用(1)
- iOS多线程开发—— GCD dispatch_semaphore 信号量