zoukankan      html  css  js  c++  java
  • 创建线程方式-GCD

    GCD

    (1)GCD基本知识

    GCD:Grand central Dispatch  牛逼的中枢调度器
    01 两个核心概念:队列和任务
      使用步骤:1.定制任务,2.将任务添加到队列中(遵循先进先出的原则) 02 同步函数和异步函数
      

    (2)GCD基本使用

     01 异步函数+并发队列:开启多条线程,并发执行任务

    02 异步函数+串行队列:开启一条线程,串行执行任务

    03 同步函数+并发队列:不开线程,串行执行任务

    04 同步函数+串行队列:不开线程,串行执行任务

    05 异步函数+主队列:不开线程,在主线程中串行执行任务

    06 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)

    主队列特点:如果发现主线程当前正在执行代码(任务),那么主队列将不会调度队列里的任务,直到主线程的任务执行完毕

    07 注意同步函数和异步函数在执行顺序上面的差异

    (3)GCD线程间通信

     //0.获取一个全局的并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
        //1.先开启一个线程,把下载图片的操作放在子线程中处理
        dispatch_async(queue, ^{
    
           //2.下载图片
            NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg"];
            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage *image = [UIImage imageWithData:data];
    
            NSLog(@"下载操作所在的线程--%@",[NSThread currentThread]);
    
            //3.回到主线程刷新UI
            dispatch_async(dispatch_get_main_queue(), ^{
               self.imageView.image = image;
               //打印查看当前线程
                NSLog(@"刷新UI---%@",[NSThread currentThread]);
            });
    
        });

    (4)GCD其它常用函数

    
        01 栅栏函数(控制任务的执行顺序)
        dispatch_barrier_async(queue, ^{
            NSLog(@"--dispatch_barrier_async-");
        });
    
        02 延迟执行(延迟·控制在哪个线程执行)
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"---%@",[NSThread currentThread]);
        });
    
        03 一次性代码(注意不能放到懒加载)
        -(void)once
        {
            //整个程序运行过程中只会执行一次
            //onceToken用来记录:该部分的代码是否被执行过.若执行过,则不会进行操作.
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
    
                NSLog(@"-----");
            });
        }
    
        04 快速迭代(开多个线程并发完成迭代操作)
           dispatch_apply(subpaths.count, queue, ^(size_t index) {
        });
    
        05 队列组(同栅栏函数)
        //创建队列组
        dispatch_group_t group = dispatch_group_create();
        //队列组中的任务执行完毕之后,执行该函数
        dispatch_group_notify(dispatch_group_t group,
        dispatch_queue_t queue,
        dispatch_block_t block);
  • 相关阅读:
    Python运维开发之路《WEB框架:Django》
    Python运维开发之路《函数进阶》
    Python运维开发之路《编程》
    Python运维开发之路《模块》
    Linux系统运维之Web服务器Nginx安装
    Python运维开发之路《高阶函数》
    Python运维开发之路《函数》
    <读书笔记>软件调试之道 :实证方法
    (知识分享)软硬件调试九法:第九条规则 如果你不修复一个bug,它将永远 存在
    (知识分享)软硬件调试九法:第八条规则 求助他人, 获得全新观点
  • 原文地址:https://www.cnblogs.com/zhoudaquan/p/5080397.html
Copyright © 2011-2022 走看看