美文网首页
iOS GCD(三) dispatch_barrier_asyn

iOS GCD(三) dispatch_barrier_asyn

作者: 你好哈喽哈喽 | 来源:发表于2020-06-11 16:33 被阅读0次

    我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。这样我们就需要一个相当于 栅栏 一样的一个方法将两组异步执行的操作组给分割起来,当然这里的操作组里可以包含一个或多个任务。这就需要用到dispatch_barrier_async方法在两个操作组间形成栅栏。
    dispatch_barrier_async函数会等待前边追加到并发队列中的任务全部执行完毕之后,再将指定的任务追加到该异步队列中。然后在dispatch_barrier_async函数追加的任务执行完毕之后,异步队列才恢复为一般动作,接着追加任务到该异步队列并开始执行。

    /**

    • 栅栏方法 dispatch_barrier_async
      */
    • (void)barrier {
      dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);

      dispatch_async(queue, ^{
      // 追加任务1
      for (int i = 0; i < 2; ++i) {
      [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
      NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程
      }
      });
      dispatch_async(queue, ^{
      // 追加任务2
      for (int i = 0; i < 2; ++i) {
      [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
      NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
      }
      });

      dispatch_barrier_async(queue, ^{
      // 追加任务 barrier
      for (int i = 0; i < 2; ++i) {
      [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
      NSLog(@"barrier---%@",[NSThread currentThread]);// 打印当前线程
      }
      });

      dispatch_async(queue, ^{
      // 追加任务3
      for (int i = 0; i < 2; ++i) {
      [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
      NSLog(@"3---%@",[NSThread currentThread]); // 打印当前线程
      }
      });
      dispatch_async(queue, ^{
      // 追加任务4
      for (int i = 0; i < 2; ++i) {
      [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
      NSLog(@"4---%@",[NSThread currentThread]); // 打印当前线程
      }
      });
      }

    输出结果:
    2018-02-23 20:48:18.297745+0800 YSC-GCD-demo[20188:5059274] 1---<NSThread: 0x600000079d80>{number = 4, name = (null)}
    2018-02-23 20:48:18.297745+0800 YSC-GCD-demo[20188:5059273] 2---<NSThread: 0x600000079e00>{number = 3, name = (null)}
    2018-02-23 20:48:20.301139+0800 YSC-GCD-demo[20188:5059274] 1---<NSThread: 0x600000079d80>{number = 4, name = (null)}
    2018-02-23 20:48:20.301139+0800 YSC-GCD-demo[20188:5059273] 2---<NSThread: 0x600000079e00>{number = 3, name = (null)}
    2018-02-23 20:48:22.306290+0800 YSC-GCD-demo[20188:5059274] barrier---<NSThread: 0x600000079d80>{number = 4, name = (null)}
    2018-02-23 20:48:24.311655+0800 YSC-GCD-demo[20188:5059274] barrier---<NSThread: 0x600000079d80>{number = 4, name = (null)}
    2018-02-23 20:48:26.316943+0800 YSC-GCD-demo[20188:5059273] 4---<NSThread: 0x600000079e00>{number = 3, name = (null)}
    2018-02-23 20:48:26.316956+0800 YSC-GCD-demo[20188:5059274] 3---<NSThread: 0x600000079d80>{number = 4, name = (null)}
    2018-02-23 20:48:28.320660+0800 YSC-GCD-demo[20188:5059273] 4---<NSThread: 0x600000079e00>{number = 3, name = (null)}
    2018-02-23 20:48:28.320649+0800 YSC-GCD-demo[20188:5059274] 3---<NSThread: 0x600000079d80>{number = 4, name = (null)}

    在dispatch_barrier_async相关代码执行结果中可以看出:

    在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。

    相关文章

      网友评论

          本文标题:iOS GCD(三) dispatch_barrier_asyn

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