zoukankan      html  css  js  c++  java
  • GCD基础

    一 GCD 与NSOperation 

    GCD -- (iOS4.0)多线程解决方案

        将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)

        拿到dispatch_get_main_queue,线程之间的通信

        NSOperation -- (iOS2.0)  (后经苹果改造)

        将操作添加到队列里

        [NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行

        NSOperation可以设置最大并发数(用GCD处理,比较麻烦)

        可以暂停可以继续,也就是挂起操作

        取消所有的任务

        设置依赖关系

    二 什么是GCD

      GCD本身是苹果公司为多核的并发运算提出的解决办法,GCD工作时会自动利用更多的处理器核心,以充分利用更强大的机器.它是基于C语言的

      如果使用GCD,完全由系统管理线程,我不需要手动编写线程代码,只需定义想要执行的任务,然后将其添加到适当的调度队列.GCD会负责创建线程,调度你的任务,系统直接提供线程管理

    三创建

    (1)//串行队列:一个一个执行

    //同步操作:不开启新的线程

    //执行结果:不开启新的线程,一个一个顺序执行

    {

      //label:队列名

        //attr:队列属性(串行,并发)

        //DISPATCH_QUEUE_SERIAL 串行

        //DISPATCH_QUEUE_CONCURRENT 并发

        //#define DISPATCH_QUEUE_SERIAL NULL

           dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);

        NSLog(@"开始");

        //同步操作

        //操作任务:block

        dispatch_sync(queue, ^{

            //打印当前线程

            NSLog(@"%@",[NSThread currentThread]);

        });

          NSLog(@"结束");

    }

    (2)//串行队列:一个一个执行

    //异步操作:会开启新的线程

    //执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行

    {

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);

        NSLog(@"开始");

       for (NSInteger i = 0 ; i < 10; i ++ ) {

             //异步请求

            dispatch_async(queue, ^{

                  NSLog(@"%@,%@",[NSThread currentThread],@(i));

            });

        }

         NSLog(@"结束");

     }

    (3)

    //并发队列:多个线程同时执行

    //异步操作:会开启新的线程

    //执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

    //开启并发队列 

    {

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);

      NSLog(@"开始");

       for (NSInteger i = 0 ; i < 10; i ++ ) {

            //执行异步操作

            dispatch_async(queue, ^{

               NSLog(@"%@",[NSThread currentThread]);

            });

        }

       NSLog(@"结束");}

    (4)

    //并发队列:多个线程同时执行

    //同步操作:不会开启新的线程

    //执行结果:不会开启新的线程,立即执行

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);

      NSLog(@"开始");

    (5)

      // 主队列就是一种特殊的串行队列

        // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行

    {

        dispatch_queue_t queue = dispatch_get_main_queue();

       NSLog(@"开始");

       for (NSInteger i = 0; i < 10; i ++) {

            //主队列执行异步操作,异步操作有一个等待的过程

            dispatch_async(queue, ^{

                NSLog(@"%@",[NSThread currentThread]);

            });

        }

      for (NSInteger i = 0 ; i < 10; i ++ ) {

           dispatch_sync(queue, ^{

                NSLog(@"%@,%@",[NSThread currentThread],@(i));

            });

        }

       NSLog(@"结束");

     }

    (6)

     //在主队列里执行同步操作,产生死锁

        //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。

    { dispatch_queue_t queue = dispatch_get_main_queue();

       NSLog(@"1");

        dispatch_sync(queue, ^{

            NSLog(@"2");

        });

       NSLog(@"3");

     }

    (7)

    //全局队列

        //identifier  队列优先级

        //flags  苹果预留的参数(没有用)

        //DISPATCH_QUEUE_PRIORITY_DEFAULT  一般使用默认优先级

      //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

       //默认是并发队列,dispatch_get_global_queue用的多

       dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

        for (NSInteger i = 0; i < 10; i++) {

           //并发加异步

            dispatch_async(queue, ^{

                NSLog(@"%@",[NSThread currentThread]);

            });

       }

  • 相关阅读:
    xcodebuild changed some of the values
    ar和nm命令的使用(转载)
    POJ 3678 Katu Puzzle (2SAT)
    ZOJ 3664 Split the Rectangle 第37届ACM/ICPC长春赛区现场赛 J 题(模拟建树,暴力 求LCA)
    HDU 4115 Eliminate the Conflict (2SAT)
    ZOJ 3665 Yukari's Birthday 第37届ACM/ICPC长春赛区现场赛K题 (水题,枚举,二分)
    ZOJ 3662 Math Magic 第37届ACM/ICPC长春赛区H题(DP)
    【原创】2012ACM长春赛区现场赛总结
    ZOJ 3656 Bit Magic 第37届ACM/ICPC长春赛区现场赛B题 (2SAT)
    ZOJ 3657 The Little Girl who Picks Mushrooms 第37届ACM/ICPC长春赛区现场赛C题(水题)
  • 原文地址:https://www.cnblogs.com/ycg0808/p/5281540.html
Copyright © 2011-2022 走看看