iOS GCD详解(信号量)
2019-07-30 本文已影响4人
浅宇落
GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效。GCD在日常开发中, 使用的频率也是非常高的.
线程
1.同步线程
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1---我是同步线程, 顺序执行");
sleep(3); // 睡眠3秒
});
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2---我是同步线程, 顺序执行");
});
// 结果: 1---我是同步线程, 顺序执行
// 结果: 2---我是同步线程, 顺序执行
2.异步线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"1---我是异步线程, 不顺序执行");
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2---我是异步线程, 不顺序执行");
});
// 结果: 2---我是异步线程, 不顺序执行
// 结果: 1---我是异步线程, 不顺序执行
线程组
NSLog(@"开始");
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_group_enter(group);
//模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep(3);
NSLog(@"---block1结束。。。");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
//模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep(3);
NSLog(@"---block2结束。。。");
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"---全部结束。。。");
});
// 结果: 开始
// 结果: ---block1结束。。。
// 结果: ---block2结束。。。
// 结果: ---全部结束。。。
延时器
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"我是延时器, 3秒后执行");
});
// 结果: 我是延时器, 3秒后执行
单粒
static TestObject *testObject;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
testObject = [[TestObject alloc] init];
});
return testObject;
信号量
在日常开发中,
顺序请求接口(A->B->C)的场景也会出现
, 但是请求接口是异步
的, 无法达到顺序请求接口的需求, 我们可以用GCD中的信号量
来解决这个问题.
dispatch_semaphore_t sem = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);
//第一组
dispatch_async(queue, ^{
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
sleep(5);
NSLog(@"第一组");
dispatch_semaphore_signal(sem);
});
//第二组
dispatch_async(queue, ^{
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
sleep(4);
NSLog(@"第二组");
dispatch_semaphore_signal(sem);
});
//第三组
dispatch_async(queue, ^{
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
sleep(2);
NSLog(@"第三组");
dispatch_semaphore_signal(sem);
});
//执行完毕
dispatch_async(queue, ^{
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
NSLog(@"全部 执行完毕");
dispatch_semaphore_signal(sem);
});
// 结果: 第一组
// 结果: 第二组
// 结果: 第三组
// 结果: 全部 执行完毕