ios多线程操作(四)—— GCD核心概念
2016-04-16 11:51
267 查看
GCD全称Grand Central Dispatch,可译为“大派发中枢调度器”,以纯C语言写成,提供了许多非常强大的函数。GCD是苹果公司为多核的并行运算提出的解决方案,它可以自动利用更多的CPU内核来参与运算,会自动管理线程的生命周(创建线程、调度任务、销毁线程),而程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码!
GCD中有两个核心概念,一是任务,二是队列。
任务:要执行什么样的操作。任务都是预先以Block封装好准备要执行的一段代码。
队列:用来存放任务,按照先进先出的方式,调度任务在哪一条线程上执行。
GCD中有两个用来执行任务的函数,分别是同步函数和异步函数。
同步函数:该函数的代码形式如下
dispatch_sync(dispatch_queue_t queue, ^(void)block)
其中queue为队列,block为任务
同步任务并不会创建线程,但会在当前线程(可以是子线程,页可以是主线程)中执行,同步任务有一个特性,只要同步任务一添加到队列中就要马上执行,同步任务不执行完就不会执行往后的代码。
例如:
[objc] view
plain copy
- (void)viewDidLoad {
[super viewDidLoad];
// 获得全局队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 执行同步任务
dispatch_sync(q, ^{
// 让执行该任务的线程休眠2s
[NSThread sleepForTimeInterval:2.0];
NSLog(@"block - %@",[NSThread currentThread]);
});
NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}
运行结果如下:
据此可以验证同步任务的特性
异步函数:
dispatch_async(dispatch_queue_t queue, ^(void)block)
一般情况下异步任务都会开启一条子线程在后台执行(有一种情况除外,后面会讲到),异步任务的一个特性就是不用等待当前线程的任务就能直接执行
例如:
[objc] view
plain copy
- (void)viewDidLoad {
[super viewDidLoad];
// 获得全局队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 执行异步任务
dispatch_async(q, ^{
//
for (int i = 0; i<10; i++) {
NSLog(@"block - %@ - %d",[NSThread currentThread],i);
}
});
NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}
运行结果如下:
第二次运行结果:
可以看到两次运行结果不同,且不在同一线程中.
如果将代码改为如下形式:
[objc] view
plain copy
- (void)viewDidLoad {
[superviewDidLoad];
//获得全局队列
dispatch_queue_t q =dispatch_get_global_queue(0, 0);
//执行异步任务
for (int i = 0; i< 10; i++) {
dispatch_async(q, ^{
NSLog(@"block - %@ - %d",[NSThreadcurrentThread],i);
});
}
NSLog(@"viewDidLoad - %@",[NSThreadcurrentThread]);
}
执行结果如下:
由此可得队列开启多少条我们无法控制,异步函数并不会等待当前线程(当前线程为主线程)的任务。
GCD中有两个核心概念,一是任务,二是队列。
任务:要执行什么样的操作。任务都是预先以Block封装好准备要执行的一段代码。
队列:用来存放任务,按照先进先出的方式,调度任务在哪一条线程上执行。
GCD中有两个用来执行任务的函数,分别是同步函数和异步函数。
同步函数:该函数的代码形式如下
dispatch_sync(dispatch_queue_t queue, ^(void)block)
其中queue为队列,block为任务
同步任务并不会创建线程,但会在当前线程(可以是子线程,页可以是主线程)中执行,同步任务有一个特性,只要同步任务一添加到队列中就要马上执行,同步任务不执行完就不会执行往后的代码。
例如:
[objc] view
plain copy
- (void)viewDidLoad {
[super viewDidLoad];
// 获得全局队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 执行同步任务
dispatch_sync(q, ^{
// 让执行该任务的线程休眠2s
[NSThread sleepForTimeInterval:2.0];
NSLog(@"block - %@",[NSThread currentThread]);
});
NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}
运行结果如下:
据此可以验证同步任务的特性
异步函数:
dispatch_async(dispatch_queue_t queue, ^(void)block)
一般情况下异步任务都会开启一条子线程在后台执行(有一种情况除外,后面会讲到),异步任务的一个特性就是不用等待当前线程的任务就能直接执行
例如:
[objc] view
plain copy
- (void)viewDidLoad {
[super viewDidLoad];
// 获得全局队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 执行异步任务
dispatch_async(q, ^{
//
for (int i = 0; i<10; i++) {
NSLog(@"block - %@ - %d",[NSThread currentThread],i);
}
});
NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}
运行结果如下:
第二次运行结果:
可以看到两次运行结果不同,且不在同一线程中.
如果将代码改为如下形式:
[objc] view
plain copy
- (void)viewDidLoad {
[superviewDidLoad];
//获得全局队列
dispatch_queue_t q =dispatch_get_global_queue(0, 0);
//执行异步任务
for (int i = 0; i< 10; i++) {
dispatch_async(q, ^{
NSLog(@"block - %@ - %d",[NSThreadcurrentThread],i);
});
}
NSLog(@"viewDidLoad - %@",[NSThreadcurrentThread]);
}
执行结果如下:
由此可得队列开启多少条我们无法控制,异步函数并不会等待当前线程(当前线程为主线程)的任务。
相关文章推荐
- ios多线程操作(三)—— 线程通讯
- ios多线程操作(二)—— NSThread的应用
- ios多线程操作(一)—— 多线程基础与原理
- iOS远程通知的实现机制
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
- 关于iOS内购
- 利用IOS的异常处理机制来做崩溃统计分析
- iOS CocoaPods安装和使用
- IOS开发 - Info.plist跟pch文件的作用
- ios互斥锁,线程同步
- IOS开发-读取xib文件
- IOS学习之——ViewController之间双向传值(反向为代理模式)
- IOS学习之——ViewController之间正向传值
- iOS 开发 Pch 文件的正确使用
- 【iOS】代码片段库
- 不是行业饱和了,是你对行业不饱和
- iOS中宏定义的使用与规范
- iOS开发中设置圆角的方法
- iOS 谓词
- 谓词的使用(predicate)