GCD 个人理解
2018-08-23 本文已影响0人
磊简单
看GCD精讲(Swift 3&4)做的笔记
gcd 让开发人员由面向线程编程编为面向队列编程。
队列: 同步队列、异步队列
提交任务的方式:同步提交、异步提交
iOS 默认提供两种队列
1、主队列
获取方式:
dispatch_get_main_queue()
程序默认运行的队列,串行队列。
2、全局队列
获取方式
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
第一个参数为优先级,第二个参数是预留字段添0就行
组合方式
串行队列+同步提交
同步提交会阻塞当前线程,任务会提交到被提交队列顺序执行。
情况分析
- (void)viewDidLoad {
[super viewDidLoad];
// 当前队列main_queue
// 同步提交任务阻塞当前线程
// 同时主队列中viewDidLoad正在执行被阻塞,所以提交的任务永远得在排队中,所以main_queue永远阻塞
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"…………");
});
}
串行队列+异步提交
异步提交当前队列会继续执行,任务会被提交到串行队列中顺序执行。
并行队列+同步提交
同步提交会阻塞当前线程,任务会提交到被提交队列无序执行。
情况分析
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t curQue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSThread *thread1 = [[NSThread alloc]initWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(curQue, ^{
NSLog(@"4%@",[NSThread currentThread]);
sleep(5);
NSLog(@"4%@",[NSThread currentThread]);
});
}];
NSThread *thread2 = [[NSThread alloc]initWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(curQue, ^{
NSLog(@"5%@",[NSThread currentThread]);
sleep(5);
NSLog(@"5%@",[NSThread currentThread]);
});
}];
[thread1 start];
[thread2 start];
}
2019-12-26 16:05:40.758442+0800 Test[91671:3782274] <NSThread: 0x6000015b3dc0>{number = 4, name = (null)}
2019-12-26 16:05:40.758444+0800 Test[91671:3782273] <NSThread: 0x6000015b3e80>{number = 3, name = (null)}
2019-12-26 16:05:40.758696+0800 Test[91671:3782273] 4<NSThread: 0x6000015b3e80>{number = 3, name = (null)}
2019-12-26 16:05:40.758715+0800 Test[91671:3782274] 5<NSThread: 0x6000015b3dc0>{number = 4, name = (null)}
2019-12-26 16:05:45.765281+0800 Test[91671:3782273] 4<NSThread: 0x6000015b3e80>{number = 3, name = (null)}
2019-12-26 16:05:45.765281+0800 Test[91671:3782274] 5<NSThread: 0x6000015b3dc0>{number = 4, name = (null)}
并行队列+异步提交
既不阻塞线程,也无固定顺序