zoukankan      html  css  js  c++  java
  • ios 多线程小结----- GCD篇

    //3 GCD(充分利用设备的多盒)-------------
    屏蔽了线程,只能看见任务 队列
    步骤两步,定制任务,将任务添加到队列。GCD将添加的任务,放到线程中去执行,自动执行,自动释放
    原则:先进先出,先添加的任务先执行,有别于栈的先进后出,先添加的任务后执行

    -------GCD---

    GCD有两个用来执行任务的函数:同步函数,异步函数
    同步:按顺序执行任务,同一条线程执行(不开线程)
    异步:同时执行任务(开启新线程)

    同步,异步,并发,串行
    同步:当前线程执行,不具备开启新线程的能力
    异步:在新线程执行,具备开启新线程的能力
    并发:多个任务同时执行,
    串行:一个任务执行完毕,在执行下一个任务

    <1> 创建全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
    注释:建立一个全局队列,优先级为默认(队列的调度频率为默认),后面默认0,苹果官方说明,以后可能会有用,
    dispatch_async(queue,)^{
    NSLog(@"---任务1---%@",[NSThread currentThread]);
    }
    dispatch_async(queue,)^{
    NSLog(@"---任务2---%@",[NSThread currentThread]);
    }
    dispatch_async(queue,)^{
    NSLog(@"---任务3---%@",[NSThread currentThread]);
    }
    分析:决定是否开启线程的是函数async,异步则开启新线程,全局队列属于并发队列,即为任务可以同时执行,则执行方案为,开启三条线程(非主线程的三条新线程),同时执行三个任务。
    若函数为sync,即为同步函数,同步不会开启新线程(即在当前线程中执行任务),主队列的并发则失去意义,任务是依次执行的,so 和串行一样了

    <2>创建串行队列
    dispatch_queue_t queue = dispatch_queue_creat("NiuBiDe.queue",NULL);
    注释:""中为串行队列的名称
    dispatch_async(queue,)^{
    NSLog(@"---任务1---%@",[NSThread currentThread]);
    }
    dispatch_async(queue,)^{
    NSLog(@"---任务2---%@",[NSThread currentThread]);
    }
    dispatch_async(queue,)^{
    NSLog(@"---任务3---%@",[NSThread currentThread]);
    }
    分析:async为异步函数,则会开启新线程,串行队列为非并发队列,则执行方案为开启新的线程 在这条线程中依次执行1,2,3任务
    若为同步函数,则在主线程中依次执行三个任务

    <3>创建主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    主队列是特殊的串行队列 无论同步异步都都会在主线程中执行任务
    切忌:如果在主线程中执行同步方法会出现死锁现象,所以主线程中需用异步主队列执行任务操作
    应用:多用于处理耗时操作的子线程中 处理UI显示问题,创建主线程 异步显示UI之用

    GCD总结:

    dispatch_async(sync)(全局队列/主队列/串行队列)block^{
    }

    表格----
    全局队列 串行队列 主队列

    同步 不开启新线程 不开启新线程 不开启新线程
    任务串行执行 任务串行执行 串行执行任务


    异步 开启线程 开启线程 不开启线程
    任务并发执行 任务串行执行 任务串行执行


    其他用法:
    - 延迟调用
    对比 [self performSelected:@selected(run)withObject:nil afterDealy:2.0];当前线程延迟2.0秒调用run方法

    dispatch_after(DISPATCH_TIME_NOW,(int64_t)(3.0* NSEC_PER_SEC),dispatch_get_main_queue()))^{

    }
    注释:dispatch_get_main_queue()即为在主队列中执行延迟操作,如果换成
    全局队列则会在其他线程中执行操作!~ 牛B!~

    - 一次性代码
    dispatch_once ^{
    }
    注释:保证在整个程序运行中此代码只执行一次!~

    - 队列组(神奇!~)
    应用场景:当两个耗时操作都完成后,才操作UI显示,两个图片下载完毕后,合并显示在UI上

    //创建队列组
    dispatch_group_t group = dispatch_group_creat();

    //开启下载任务1
    dispatch_group_async(group,global_queue,^{
    //还是操作1
    })];

    //开启下载任务2
    dispatch_group_async(group,global_queue,^{
    //还是操作2
    })];

    //等gruop中的任务都执行完毕,在执行其他操作
    dispatch_group_notify(group,main_queue^{

    //在主线程中,处理显示UI细节。
    })];

  • 相关阅读:
    mvc生成table
    JQ仿ebay右侧flash商品展示
    调查一下,EF的Bug?
    SpringCloud组件Zuul入门解析
    SpringCloud组件Ribbon入门解析
    FTO介绍
    算法网址收藏
    哈拂大学凌晨四点的景象
    【系统学习ES6】第二节:解构赋值
    MySQL高级
  • 原文地址:https://www.cnblogs.com/ly1973/p/4376658.html
Copyright © 2011-2022 走看看