• iOS GCD的使用


    GCD  Grand Central Dispatch 纯C语言编写

    1. GCD是苹果公司为多核的并行运算提出的解决方案

      GCD会自动利用更多的CPU内核(比如双核、四核)

      GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

      程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

      进程:也就是一个正在运行的应用程序。

      线程:进程中的某一条完整的执行路径。一个进程可以有多个线程,至少有一个线程,即主线程。在iOS开发中,所有涉及UI界面的,必须在主线程中更新。

    2.   GCD的工作原理:让程序平行排队,根据可用的处理资源,安排他们在任何可用的处理器上执行任务

    3.   GCD常见的三种队列:

      串行队列: dispatch_queue_create  顺序执行,一个任务执行完才能执行下一个任务,先进先出

      并行队列: dispatch_get_global_queue 可同时执行任务

      主队列:dispatch_get_main_queue   程序的主线程,其他的线程都是主线程的子线程,所以涉及UI界面更新,必须在主线程完成

    4.   串行队列,并行队列,同步任务,异步任务。

      同步任务:按顺序执行,不会开辟线程

      异步任务:会开辟线程,在串行队列只开启一个子线程,异步任务在并行队列开启多个子线程。

    5. 并行队列 + 异步任务 = 并发编程

     //GCD 并行队列,异步任务:开启多个线程,同时执行。
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            for (int i =0; i<1000; i++) {
                NSLog(@"AAAAA %d",i);
            }
        });
        
        dispatch_async(queue, ^{
            for (int i =0; i<1000; i++) {
                NSLog(@"BBBBB %d",i);
            }
        });
        
        dispatch_async(queue, ^{
            for (int i =0; i<1000; i++) {
                NSLog(@"CCCCC %d",i);
            }
        });
        
        //串行队列,同步任务 :不开启线程,按顺序执行
        dispatch_queue_t Cqueue = dispatch_queue_create("queueName", NULL);
        dispatch_sync(Cqueue, ^{
            for (int i =0; i<1000; i++) {
                NSLog(@"DDDDD %d",i);
            }
        });
        
        dispatch_sync(Cqueue, ^{
            for (int i =0; i<1000; i++) {
                NSLog(@"EEEEE %d",i);
            }
        });
        
        dispatch_sync(Cqueue, ^{
            for (int i =0; i<1000; i++) {
                NSLog(@"FFFFF %d",i);
            }
        });

    6.我们平时使用多线程,会经常碰到一种需求:子线程任务处理完成之后,需要主线程更新UI。我们如何才能知道子线程的任务都完成了。

      当我们使用串行队列时,只需将最后的回调主线程任务添加在所有任务的最后,顺序执行,便可回调。 但是当我们使用并行队列时候,就无法知道什么时候完成所有的子线程任务,

      这时候,就得用到dispatch_group了。代码如下:

     //我们同时执行几个异步任务,他们执行完了,我们有时候还得知道一下,,怎么办呢,这时候,就得用到dispatch_group了,如下编代码这样弄,到最后执行 dispatch_group_notify ,便可
        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, ^{
            NSLog(@"开始执行1");
        });
        
        dispatch_group_async(group, queue, ^{
            NSLog(@"开始执行2");
        });
        
        dispatch_group_async(group, queue, ^{
            NSLog(@"开始执行3");
        });
        
        dispatch_group_notify(group, queue, ^{
            NSLog(@"全部执行完成,必须在主线程更新UI!!!");
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"主线程更新UI完成。");
            });
        });

    *以上如有不对的地方,欢迎各位指正,同时也欢迎大家交流。

  • 相关阅读:
    Thinkpad R400无线网络一个都不见了!
    如果使用安卓4.4的SD卡?
    如何使用安卓4.4的SD卡?
    在IAR使用FreeRTOS出现Error[Pa045]: function "XXX" has no prototype
    DSP5509的RTC实验-第3篇
    LWM2M简介-学习记录
    DSP5509的定时器实验-第2篇
    DSP5509的XF实验-第一篇
    华为LiteOS系统使用-任务调度函数-第一篇
    2017-12-24自选的股票之春秋航空
  • 原文地址:https://www.cnblogs.com/heyuanbo/p/5203437.html
Copyright © 2020-2023  润新知