为什么我总能猜到奇奇怪怪的事,今天有点不淡定了,做好自己,自信,(๑•̀ㅂ•́)و✧加油。
七 队列的循环、挂起、恢复
dispatch_apply()函数是用来循环执行队列中的任务的,使用方式是dispatch_apply(循环次数,任务所在队列 {要循环执行的任务})。在串行队列中,会在当前线程中执行。在并行队列的时候,会开辟新的线程,不过有可能会在当前线程中执行一些任务。不管是并行还是串行,dispatch_apply都会阻塞当前线程。
NSLog(@"循环多次执行串行队列");
dispatch_queue_t serialQueue = [self getSerialQueue:"串行"];
dispatch_apply(2, serialQueue, ^(size_t index) {
[self currentThreadSleep:index];
NSLog(@"第%zu次执行,%@",index,[self getCurrentThread]);
});
NSLog(@"循环多次执行并行队列");
dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
dispatch_apply(2, concurrentQueue, ^(size_t index) {
[self currentThreadSleep:index];
NSLog(@"第%zu次执行,%@",index,[self getCurrentThread]);
});
输出的结果为
下面的代码就是讲队列挂起和唤醒。
dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
//将队列进行挂起
dispatch_suspend(concurrentQueue);
dispatch_async(concurrentQueue, ^{
NSLog(@"任务执行");
});
[self currentThreadSleep:2];
//将挂起的队列唤醒
dispatch_resume(concurrentQueue);
八 任务栅栏
这个和任务组有点类似,将队列中的任务进行隔离,让任务能分拨的进行异步执行。从结果中可以看出,dispatch_barrier_async之前的任务会先异步执行,完成后执行栅栏中的任务块,当任务块执行完毕后,才会执行第二批任务。
dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
//第一批任务
for (int i = 0 ; i < 3 ; i ++ )
{
dispatch_async(concurrentQueue, ^{
[self currentThreadSleep:i];
NSLog(@"第一批任务,%d,%@",i,[self getCurrentThread]);
});
}
//添加栅栏
dispatch_barrier_async(concurrentQueue, ^{
NSLog(@"第一批执行完后才会执行第二批,%@",[self getCurrentThread]);
});
//第二批任务
for (int i = 0 ; i < 3 ; i ++ )
{
dispatch_async(concurrentQueue, ^{
[self currentThreadSleep:i];
NSLog(@"第二批任务,%d,%@",i,[self getCurrentThread]);
});
}
GCD定时器的应用在前面的iOS 实现红包雨中也提到了,GCD的用法也总结的差不多了,欢迎来查漏补缺。