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)}

并行队列+异步提交
既不阻塞线程,也无固定顺序

上一篇 下一篇

猜你喜欢

热点阅读