美文网首页
GCD中的栅栏函数和线程组

GCD中的栅栏函数和线程组

作者: heart_领 | 来源:发表于2018-05-23 14:40 被阅读181次

一、栅栏函数(用于同步执行的block代码块)

1.同步栅栏函数

dispatch_barrier_sync(dispatch_queue_tqueue,dispatch_block_tblock);

特点:

*栅栏函数会在之前的任务都结束后才开始执行

*栅栏函数结束之后才会执行栅栏函数下一行代码,栅栏函数结束之前,下一行代码不会执行(不会把后面的任务添加到队列中,只有等到栅栏函数结束后,才会把任务添加到队列中并执行任务)

2.异步栅栏函数

dispatch_barrier_async(dispatch_queue_tqueue,dispatch_block_tblock);

特点:

*栅栏函数会在之前的任务都结束后才会执行

*栅栏函数结束之后才会才会执行栅栏函数后面的任务,栅栏函数结束之前,后面的任务代码依然执行,只是把任务添加到队列中,但不会执行任务,只有等栅栏函数结束后才会执行任务

二、线程组

1.全局队列下的线程组 dispatch_group_async内部封装了dispatch_group_enter和dispatch_group_leave

```

-(void)group{

//    1.创建任务队列组   

dispatch_group_t group = dispatch_group_create();

//    2.创建全局队列   

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    3.把任务添加到队列组中   (用于同步执行的block代码块)

dispatch_group_async(group, globalQueue, ^{     

  NSLog(@"执行任务1");   

});   

dispatch_group_async(group, globalQueue, ^{       

NSLog(@"执行任务2");   

});   

dispatch_group_async(group, globalQueue, ^{       

NSLog(@"执行任务3");   

});   

dispatch_group_notify(group, globalQueue, ^{               

NSLog(@"任务1、2、3执行完之后才执行的任务%@",[NSThread currentThread]);        dispatch_async(dispatch_get_main_queue(), ^{                       

NSLog(@"刷新UI的操作%@",[NSThread currentThread]);     

  }); 

  });

}

2.自定义并发队列下的线程组

-(void)group2{

//    1.创建任务队列组   

dispatch_group_t group = dispatch_group_create();

//    2.创建自定义并发队列   

dispatch_queue_t customQueue = dispatch_queue_create("customQueue", DISPATCH_QUEUE_CONCURRENT);

//    3.把任务加入队列组中   (用于异步执行的block代码块)

dispatch_group_enter(group);   

dispatch_async(customQueue, ^{   

    NSLog(@"执行任务1");       

dispatch_group_leave(group); 

  });   

dispatch_group_enter(group);   

dispatch_async(customQueue, ^{   

    NSLog(@"执行任务2");       

dispatch_group_leave(group); 

  });   

dispatch_group_enter(group);   

dispatch_async(customQueue, ^{       

NSLog(@"执行任务3");       

dispatch_group_leave(group);   

});   

dispatch_group_notify(group, customQueue, ^{               

NSLog(@"任务1、2、3执行完之后才执行的任务%@",[NSThread currentThread]);        

dispatch_async(dispatch_get_main_queue(), ^{                       

NSLog(@"刷新UI的操作%@",[NSThread currentThread]);       

}); 

  });

//    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

//    * DISPATCH_TIME_NOW 前面任务为执行完之前就会执行后面的代码

//    * DISPATCH_TIME_FOREVER 等待前面的任务都执行完之后,才会执行下一行代码 //    NSLog(@"我是🔥🔥🔥🔥🔥🔥");

}

推荐文章:

https://www.jianshu.com/p/c3edd6aa75a2

https://www.jianshu.com/p/a5048100e843

https://www.jianshu.com/p/3617310137ee

相关文章

网友评论

      本文标题:GCD中的栅栏函数和线程组

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