IOS知识积累

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);
});
// 结果:  第一组
// 结果:  第二组
// 结果:  第三组
// 结果:  全部 执行完毕
上一篇下一篇

猜你喜欢

热点阅读