zoukankan      html  css  js  c++  java
  • iOS开发——GCD多线程详解

    GCD多线程详解


    1. 什么是GCD

    Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程编程

    2. 简单使用GCD

    /**
     *  在主线程执行
     */
    dispatch_async(dispatch_get_main_queue(), ^{
        ;
    });
    
    /**
     *  在后台线程执行
     */
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        ;
    });
    
    /**
     *  只执行一次
     *  (特别适合在单例中使用)
     */
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        ;
    });
    
    /**
     *  延迟X秒执行
     */
    double delayTime = 2.0;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        ;
    });
    

    3. GCD多线程的坑

    • 由于使用Block作为线程执行方法,所以Block的坑都要注意,比如__weak__block
    • 所有的UI变化都要在主线程完成,后台线程的UI变化代码不会立即起作用,只有在主线程改变UI才能立即起变化

    4. GCD高级用法

    • 创建串行线程
      串行线程对于一些需要串行运行的代码来说非常有用,比如说数据库的操作或者文件的操作
    /**
     *  创建一个串行线程队列SerialQuene,一次只执行一个任务
     *
     *  @param "com.SerialQuene" 队列名,一般为com.quene名字
     *  @param NULL              NULL就创建Serial线程
     *
     */
    dispatch_queue_t serialQuene = dispatch_queue_create("com.SerialQuene", NULL);
    
    • 创建并行线程
    /**
     *  创建一个并行线程队列ConcurrentQuene,一次能并行执行多个任务,完成的时间不定
     *
     *  @param "com.ConcurrentQuene"        队列名,一般为com.quene名字
     *  @param DISPATCH_QUEUE_CONCURRENT    创建一个并行Concurrent线程
     *
     */
    dispatch_queue_t concurrentQuene = dispatch_queue_create("com.ConcurrentQuene", DISPATCH_QUEUE_CONCURRENT);
    
    • 在同一个线程组执行多个线程,并在线程都执行完毕后做出响应
    /**
     *  创建一个Group,在Group中执行的线程都结束了以后会通知notify执行
     */
    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, quene, ^{
        NSLog(@"1");
    });
    dispatch_group_async(group, quene, ^{
        NSLog(@"2");
    });
    dispatch_group_async(group, quene, ^{
        NSLog(@"3");
    });
    dispatch_group_notify(group, quene, ^{
        NSLog(@"等到group所有线程全都执行完了以后才会执行");
    });
    
  • 相关阅读:
    Laravel 学习笔记之文件上传
    Composer学习
    Laravel 学习笔记之数据库操作——Eloquent ORM
    PHP至Document类操作 xml 文件
    使用promise构建一个向服务器异步数据请求
    遍历DOM树
    关于tp验证码模块
    layui 封装自定义模块
    js进阶之路,关于UI资源的优化(转载)
    关于js 重载
  • 原文地址:https://www.cnblogs.com/wisejoker/p/3958319.html
Copyright © 2011-2022 走看看