美文网首页IOS知识积累
iOS GCD详解(信号量)

iOS GCD详解(信号量)

作者: 浅宇落 | 来源:发表于2019-07-30 18:09 被阅读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);
});
// 结果:  第一组
// 结果:  第二组
// 结果:  第三组
// 结果:  全部 执行完毕

相关文章

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • iOS Objective-C GCD 应用篇

    iOS Objective-C GCD 应用篇 本文主要对GCD中的dispatch_semaphore(信号量)...

  • 多线程GCD/NSOperation/NSThread

    iOS常用的多线程:GCD、NSOperation、NSThread GCD 信号量 多度单写 image.png...

  • iOS GCD详解(信号量)

    GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作...

  • iOS 并发机制

    ios 并发机制(一) —— GCD中的信号量及几个重要函数ios 并发机制(二) —— NSOperation实...

  • 2、ios下如何实现指定线程数目的线程池?

    ios下如何实现指定线程数目的线程池? 1、GCD的信号量机制(dispatch_semaphore) 信号量是一...

  • 线程

    iOS 多线程:『GCD』详尽总结 NSThread详解 IOS 多线程编程 『NSOperation、NSOpe...

  • iOS GCD详解《二》

    GCD详解 《一》[https://www.jianshu.com/p/7e83243a12a6]iOS GCD信...

  • GCD 文章理解

    GCD详解 1,GCD如何控制线程的最大并发数? (1,通过信号量的大小控制线成并发执行的数量) (2,一定数量的...

  • iOS多线程相关面试题

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

网友评论

    本文标题:iOS GCD详解(信号量)

    本文链接:https://www.haomeiwen.com/subject/gxinrctx.html