美文网首页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);
    });
    // 结果:  第一组
    // 结果:  第二组
    // 结果:  第三组
    // 结果:  全部 执行完毕
    

    相关文章

      网友评论

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

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