zoukankan      html  css  js  c++  java
  • 队列 和 线程 之GCD dispatch

    1.dispatch_queue_create  创建队列开启异步线程(1,4,2,3)

      // 创建一个队列
        dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"1111");
        // 开启一个异步线程
        dispatch_async(queue, ^{
            NSLog(@"2222");
            // 线程等待10秒
            [NSThread sleepForTimeInterval:5];
            NSLog(@"3333");
        });
        
        NSLog(@"4444");

    2.创建队列开启同步线程(1,2,3,4)

        // 创建一个队列
        dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"1111");
        // 开启一个同步线程
        dispatch_sync(queue, ^{
            NSLog(@"2222");
            // 线程等待10秒
            [NSThread sleepForTimeInterval:5];
            NSLog(@"3333");
        });
        
        NSLog(@"4444");

    3.dispatch_get_global_queue 获取全局队列开启异步线程(1,4,2,3)

        NSLog(@"1111");
        // 获取全局队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        // 开启一个异步线程
        dispatch_async(queue, ^{
            NSLog(@"2222222");
            [NSThread sleepForTimeInterval:5];
            NSLog(@"333");
        });
        NSLog(@"4444");

    4.获取全局队列开启同步线程 (1,2,3,4)

        NSLog(@"1111");
        // 获取全局队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        // 开启一个同步线程
        dispatch_sync(queue, ^{
            NSLog(@"2222222");
            [NSThread sleepForTimeInterval:5];
            NSLog(@"333");
        });
        NSLog(@"4444");

    5.dispatch_get_main_queue()  获取主线程队列,再开启异步线程(1,4,2,3)

        NSLog(@"1111");
        // 获取主线程队列
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
            NSLog(@"2222");
            [NSThread sleepForTimeInterval:5];
            NSLog(@"33333");
        });
        NSLog(@"4444");

    6.获取主线程队列,再开启同步线程 (1) 。 线程会因为死锁,而永远卡死

        NSLog(@"1111");
        // 获取主线程队列
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_sync(queue, ^{
            NSLog(@"2222");
            [NSThread sleepForTimeInterval:5];
            NSLog(@"33333");
        });
        NSLog(@"4444");

    总结:获取全局队列的名字是默认的,创建队列时可以自己命名队列的名字,其他用法都是一样的。个人认为同步线程意义不大

    7.dispatch_get_main_queue()  回到主线程
        耗时操作需需要放在异步线程里,UI界面更新必须放在主界面里
        [2376:131819] 1111
        [2376:131819] 4444
        [2376:131860] 2222
        [2376:131860] 3333
        [2376:131819] 5555
        从打印结果来看(1,4,5是在主线程里面,2,3是在异步线程里面)

        NSLog(@"1111");
        // 获取主线程队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            NSLog(@"2222");
            [NSThread sleepForTimeInterval:5];
            // 回到主线程
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"5555");
            });
            NSLog(@"3333");
        });
        NSLog(@"4444");

    8.dispatch_apply  执行某个片段N(6)次

        dispatch_apply(6, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
            NSLog(@"1111");
        });

    9.dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行 (2,1,3,4)

        dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:3];
            NSLog(@"111");
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:2];
            NSLog(@"222");
        });
        dispatch_barrier_async(queue, ^{
            NSLog(@"333_barrier");
            [NSThread sleepForTimeInterval:4];
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:1];
            NSLog(@"444");
        });

    10.dispatch_group_async 可以实现监听几组任务是否完成,完成后使用 dispatch_group_notify 执行其他的操作 (1,2,3,4)

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        // 创建一组任务
        dispatch_group_t group = dispatch_group_create();
        
        dispatch_group_async(group, queue, ^{
            [NSThread sleepForTimeInterval:1];
            NSLog(@"111");
        });
        dispatch_group_async(group, queue, ^{
            [NSThread sleepForTimeInterval:2];
            NSLog(@"222");
        });
        dispatch_group_async(group, queue, ^{
            [NSThread sleepForTimeInterval:3];
            NSLog(@"333");
        });
        // 监听所有组的任务完成之后执行,一般是回到主线程刷新UI界面
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"444");
        });

    11.dispatch_once 对于某个任务执行一次,且只执行一次。 dispatch_once函数有两个参数,第一个参数predicate用来保证执行一次,第二个参数是要执行一次的任务block。

    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        // some one-time task
    });

    暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!

  • 相关阅读:
    查找oracle数据文件、表空间的位置
    select into 给多变量赋值
    关于Union 中 ORA-12704:字符集不匹配问题的解决
    weblogic线程阻塞性能调优(图解)
    window系统无法访问局域网内文件共享的问题
    查看oracle的sql语句历史记录和锁表的情况
    <c:forEach>标签的使用 JSTL
    CAS服务下单点登录(服务端与客户端)
    cas 配置数据源 , 解决CAS 不支持你提供的凭证 .
    信号量通俗释义
  • 原文地址:https://www.cnblogs.com/shen5214444887/p/4917343.html
Copyright © 2011-2022 走看看