美文网首页
GCD常用方法

GCD常用方法

作者: Super_Yuan | 来源:发表于2017-09-28 15:03 被阅读28次

    1.创建异步线程

    NSLog(@"hello world 1");
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            sleep(1);
            NSLog(@"hello world 2");
        });
        NSLog(@"hello world 3");
    
    屏幕快照 2017-09-28 下午3.11.55.png

    2.创建同步线程

    NSLog(@"hello world 1");
        dispatch_sync(dispatch_get_global_queue(0, 0), ^{
            sleep(1);
            NSLog(@"hello world 2");
        });
        NSLog(@"hello world 3");
    
    屏幕快照 2017-09-28 下午3.11.27.png

    3.创建主线程

    dispatch_async(dispatch_get_main_queue(), ^{
            //刷新界面代码
        });
    

    4.GCD只执行一次

    static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //只执行一次代码
        });
    

    5.线程延迟调用

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
            NSLog(@"## 在主线程延迟5秒调用 ##");
        });
    

    6.信号量

    dispatch_semaphore_create //创建一个semaphore 通过dispatch_semaphore_create 函数创建一个Semaphore并初始化信号的总量。

    dispatch_semaphore_signal //发送一个信号 通过dispatch_semaphore_signal 函数发送一个信号,让信号总量加1。

    dispatch_semaphore_wait  //等待信号 通过dispatch_semaphore_wait可以使总信号量减1,当信号总量为0时就会一直等待,否则就可以正常执行

    dispatch_semaphore_t semaoh = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
           //获取数据  执行信号数量+1
            dispatch_semaphore_signal(semaoh);
        });
    //使总信号量减1
    dispatch_semaphore_wait(semaoh, DISPATCH_TIME_FOREVER);
    

    7.多个请求都结束后,在执行界面刷新

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            //创建组
            dispatch_group_t group=dispatch_group_create();
            
            // 关联一个任务到group
            dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //任务一
                NSLog(@"******执行任务一******");
            });
            
            // 关联一个任务到group
            dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //任务二
                NSLog(@"******执行任务二******");
            });
            
            // 等待组中的任务执行完毕,回到主线程执行block回调
            dispatch_group_notify(group, dispatch_get_main_queue(), ^{
                //任务三 回到主线程刷新界面
                dispatch_async(dispatch_get_main_queue(), ^{
                //刷新界面代码
        });
        });
    

    8. dispatch_barrier_async的使用

    dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

    dispatch_queue_t queue = dispatch_queue_create("create_asy_queue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            NSLog(@"任务一");
        });
        dispatch_async(queue, ^{
            NSLog(@"任务二");
        });
        dispatch_barrier_async(queue, ^{
            NSLog(@"dispatch_barrier_async");
            //FIXEM:任务一和二都执行完了,才执行
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"刷新界面");
            });
            
        });
        dispatch_async(queue, ^{
            //FIXEM:界面刷新完了,才执行
            [NSThread sleepForTimeInterval:1];
            NSLog(@"任务三");
        });
    

    相关文章

      网友评论

          本文标题:GCD常用方法

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