美文网首页
iOS多线程-GCD的基本使用

iOS多线程-GCD的基本使用

作者: 学习天亦 | 来源:发表于2019-06-02 22:27 被阅读0次

    复习下线程的基础知识, 这里主要是参考文顶顶多线程篇复习写的。

    GCD概念

    1、GCD中有2个核心概念
    • 任务:执行什么操作
    • 队列:用来存放任务
    2、GCD的使用步骤
    • 定制任务
      确定想做的事情

    • 将任务添加到队列中
      GCD会自动将队列中的任务取出,放到对应的线程中执行
      任务的取出遵循队列的FIFO原则:先进先出,后进后出

    3、 GCD中有2个用来执行任务的函数
    • 用同步的方式执行任务
    dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
    
    • 用异步的方式执行任务
    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
    
    4、 GCD的队列可以分为2类型
    • 并发队列(Concurrent Dispatch Queue)
      可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
      并发功能只有在异步(dispatch_async)函数下才有效

    • 串行队列(Serial Dispatch Queue)
      串行队列(Serial Dispatch Queue)
      让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

    5、有4个术语比较容易混淆:同步、异步、并发、串行
    • 同步和异步决定了要不要开启新的线程
      同步:在当前线程中执行任务,不具备开启新线程的能力
      异步:在新的线程中执行任务,具备开启新线程的能力

    • 并发和串行决定了任务的执行方式
      并发:多个任务并发(同时)执行
      串行:一个任务执行完毕后,再执行下一个任务

    代码示例

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        [self asyncSerialQueue];
    }
    
    /**
     *  async -- 并发队列(最常用)
     *  会不会创建线程:会,一般同时开多条
     *  任务的执行方式:并发执行
     */
    - (void)asyncGlobalQueue {
        // 获得全局的并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 将 任务 添加 全局队列 中去 异步 执行
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
        });
    }
    
    /**
     *  async -- 串行队列(有时候用)
     *  会不会创建线程:会,一般只开1条线程
     *  任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务)
     */
    - (void)asyncSerialQueue {
        // 1.创建一个串行队列
        dispatch_queue_t queue = dispatch_queue_create("com.zhang.queue", NULL);
        
        // 2.将任务添加到串行队列中 异步 执行
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
        });
        
        // 3.非ARC,需要释放创建的队列
        //    dispatch_release(queue);
    }
    
    /**
     *  async -- 主队列(很常用)
     */
    - (void)asyncMainQueue {
        // 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)
        dispatch_queue_t queue = dispatch_get_main_queue();
        
        // 2.添加 任务 到主队列中 异步 执行
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
        });
    }
    
    /**
     *  sync -- 主队列(不能用---会卡死)
     */
    - (void)syncMainQueue {
        NSLog(@"syncMainQueue----begin--");
        
        // 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)
        dispatch_queue_t queue = dispatch_get_main_queue();
        
        // 2.添加 任务 到主队列中 异步 执行
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
        });
        
        NSLog(@"syncMainQueue----end--");
    }
    
    
    /**
     *  sync -- 并发队列
     *  会不会创建线程:不会
     *  任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务)
     *  并发队列失去了并发的功能
     */
    - (void)syncGlobalQueue {
        // 获得全局的并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 将 任务 添加到 全局并发队列 中 同步 执行
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
        });
    }
    
    /**
     *  sync -- 串行队列
     *  会不会创建线程:不会
     *  任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务)
     */
    - (void)syncSerialQueue {
        // 创建一个串行队列
        dispatch_queue_t queue = dispatch_queue_create("com.zhang.queue", NULL);
        
        // 将 任务 添加到 串行队列 中 同步 执行
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片1---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片2---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片3---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片4---%@", [NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"-----下载图片5---%@", [NSThread currentThread]);
        });
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS多线程-GCD的基本使用

          本文链接:https://www.haomeiwen.com/subject/xststctx.html