多线程篇-GCD-常用方法的使用

延迟执行

//第一个参数:dispatch_time_t when     时间
//第二个参数:dispatch_queue_t queue   队列
//第三个参数:dispatch_block_t block   执行的block

//这段代码的含义为:让主队列延迟两秒打印LitterL
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSLog(@"LitterL");
});

一次性执行

//第一个参数:dispatch_once_t *predicate  记录代码是否被执行过  默认为0  但执行一次后就是-1了  所以就看到智能执行一次的这个效果
//第二个参数:dispatch_block_t block 执行的block
_dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
{
	if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
		dispatch_once(predicate, block);
	}
}

//-------------------实例---------------------
 -(void)once
    {
        //整个程序运行过程中只会执行一次
        //onceToken用来记录该部分的代码是否被执行过
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSLog(@"LitterL");
        });
    }

栅栏函数(控制任务的执行顺序)

//栅栏函数

//第一个参数 dispatch_queue_t 队列
//第二个参数 dispatch_block_t 执行的block
//作用:在我们需要控制任务的顺序的时候可以使用栅栏函数,进行控制
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

//-------------------------实例---------------------------
//
//      不管怎么输出,我的1-X、2-X都是在上面,而不是随意乱输出
//
-(void)barrier
{
    //1.获得队列
    dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);

    //2.异步函数
    dispatch_async(queue, ^{

        for (NSInteger i =0; i<10; i++) {
               NSLog(@"1-%zd--%@",i,[NSThread currentThread]);
        }

    });

    dispatch_async(queue, ^{
        for (NSInteger i =0; i<10; i++) {
            NSLog(@"2-%zd--%@",i,[NSThread currentThread]);
        }
    });

    //栅栏函数:控制并发队列中任务的执行顺序
    dispatch_barrier_async(queue, ^{
        NSLog(@"+++++++++++++++++++++++++++");
    });

    dispatch_async(queue, ^{
        for (NSInteger i =0; i<10; i++) {
            NSLog(@"3-%zd--%@",i,[NSThread currentThread]);
        }
    });

    dispatch_async(queue, ^{
        for (NSInteger i =0; i<10; i++) {
            NSLog(@"4-%zd--%@",i,[NSThread currentThread]);
        }
    });

}

快速迭代

-(void)test
{
    //1.获得并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //2.快速迭代
    /*
     第一个参数:要迭代的次数
     第二个参数:队列,并发队列
     第三个参数:block 封装任务
     */
    dispatch_apply(10, queue, ^(size_t index) {
        NSLog(@"%zd----%@",index,[NSThread currentThread]);
    });

}

队列组

-(void)group
{
    //0.创建队列组
    dispatch_group_t group = dispatch_group_create();

    //1.创建队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //2.异步函数
    /*
     1)封装任务
     2)把任务添加到队列中
     3)监听任务的执行情况,group
     */
    dispatch_group_async(group, queue, ^{
          NSLog(@"download1---%@",[NSThread currentThread]);
    });

     dispatch_group_async(group, queue, ^{
        NSLog(@"download2---%@",[NSThread currentThread]);
    });

     dispatch_group_async(group, queue, ^{
        NSLog(@"download3---%@",[NSThread currentThread]);
    });

    //3.当队列组中所有的任务都执行完毕之后会通知group执行dispatch_group_notify方法
    dispatch_group_notify(group, queue, ^{
        NSLog(@"队列组中所有的任务都执行完毕了");
    });
}

结束

                  本章到此结束
            欢迎各位码友随意转载并指正
posted @ 2016-01-12 23:51  周大萌的萌  阅读(207)  评论(0编辑  收藏  举报