zoukankan      html  css  js  c++  java
  • 【iOS】多线程GCD

    GCDGrand Central Dispatch : 牛逼的中枢调度器。苹果自带,纯C语言实现,提供了许多且强大的函数,它能够提高代码的运行效率与多核的利用率。

    一、GCD的基本使用

    1、GCD中的两个核心概念:
    任务运行什么任务.
    队列用来存放任务. (用来调度任务)
    2、GCD使用的2个步骤:
    1.任务. (确定想做的事情)
    2.任务加入到队列中.
    GCD自己主动队列中的任务取出, 放到相应的线程中运行.
    遵循队列的FIFO原则: 先进先出.
    3、同步和异步的差别: (是否开启新线程)
    同步:在当前线程中运行.
    异步:在还有一条线程中运行.
    4、并行与串行队列 : (任务的运行方式)
    并行对列:异步情况下, 让多个任务并发运行.
    串行队列:一个任务运行完后,再运行下一个任务.

    队列又分为几种:自己定义的队列、全局队列、主队列
    基本使用代码例如以下:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        [self gcdDemo4];
    }
    
    #pragma mark - 串行队列
    - (void)gcdDemo1{
        // 1. 串行队列
        // 在使用GCD的时候,先敲dispatch
        // 在C语言中,定义对象一般是以 _t 或者 Ref 结尾的
        dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_SERIAL); //DISPATCH_QUEUE_SERIAL 的值为 NULL
        
        NSLog(@"%@", [NSThread currentThread]);
        
        // 2. 同步任务 sync(实际开发中没用)
        for (int i = 0; i < 10; i++) {
            dispatch_sync(q, ^{
                NSLog(@"%@ - %d", [NSThread currentThread], i);
            });
        }
        
        // 2. 异步任务 async,可以开线程
        // 串行队列中,异步任务最多仅仅能开一条线程。全部任务顺序运行。
        // 串行队列,异步任务,在多线程中,是斯坦福大学最推荐的一种多线程方式。
        // 长处:将任务放在其它线程中工作,每一个任务顺序运行,便于调试
        // 缺点:并发能力不强。最多仅仅能使用一条线程!
        for (int i = 0; i < 10; i++) {
            dispatch_async(q, ^{
                NSLog(@"%@ - %d", [NSThread currentThread], i);
            });
        }
    }
    
    
    #pragma mark - 并行队列
    - (void)gcdDemo2{
        // 1. 并行队列
        dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_CONCURRENT);
        
        // 非ARC中,须要自己释放队列
        //    dispatch_release(q);
        
        // 2. 同步任务。不会开启新的线程
        // 在实际开发中,同步任务可以保证运行完毕之后,才让兴许的异步任务開始运行,用于控制任务之间的先后顺序。如在后台线程中。处理“用户登录”等
        for (int i = 0; i < 10; i++) {
            dispatch_sync(q, ^{
                NSLog(@"%@ - %d", [NSThread currentThread], i);
            });
        }
        
        // 3. 异步任务,会在多条线程上工作,详细开多少条线程,由系统决定
        // 仍然是依照任务加入到队列中的顺序被调度,仅仅是运行先后可能会有差异!

    // *** 可以将耗时的操作,放到子线程中工作 // *** 与串行队列异步任务相比,并发性能更好!

    可是运行的先后顺序,不固定 for (int i = 0; i < 10; i++) { dispatch_async(q, ^{ NSLog(@"%@ - %d", [NSThread currentThread], i); }); } } #pragma mark - 全局并行(并发)队列(使用更为普遍一些) - (void)gcdDemo3{ // 1. 获取全局队列(与自己定义并行队列的差别就是名字显示,其它都一样) dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 使用全局队列,不须要考虑共享的问题 // 2. 同步任务 for (int i = 0; i < 10; i++) { dispatch_sync(q, ^{ NSLog(@"%@ - %d", [NSThread currentThread], i); }); } // 3. 异步任务 for (int i = 0; i < 10; i++) { dispatch_async(q, ^{ NSLog(@"%@ - %d", [NSThread currentThread], i); }); } } #pragma mark - 主队列(专门调度在主线程上工作的队列,不能开线程) - (void)gcdDemo4{ // 1. 获取主队列 dispatch_queue_t q = dispatch_get_main_queue(); // 2. 不要同步任务(死锁!

    !!

    ) // dispatch_sync(q, ^{ // NSLog(@"不会输出的!!!"); // }); // 3. 异步任务。在主线程上依次顺序运行 for (int i = 0; i < 10; i++) { dispatch_async(q, ^{ NSLog(@"%@ - %d", [NSThread currentThread], i); }); } }


    二、GCD进行线程间通讯

    这里从主线程调用下载图片的方法。开启一个线程下载,然后在该线程任务完毕后,返回主线程。

    - (void)downloadImage{
        // 1. 全局并行队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 2. 异步任务
        dispatch_async(queue, ^{
            NSLog(@"開始下载图片 %@", [NSThread currentThread]);
            //。。。。
            NSLog(@"完毕下载图片 %@", [NSThread currentThread]);
            
            // 3. 通知主队列更新UI
            // 给主队列,加入一个异步任务。更新UI
            dispatch_async(dispatch_get_main_queue(), ^{
                //能够做更新UI操作。。

    。 }); }); }


    以下的2篇不错,能够更好的理解:
    http://blog.csdn.net/onlyou930/article/details/8225906

    http://www.cnblogs.com/pure/archive/2013/03/31/2977420.html


    转载请注明出处:http://blog.csdn.net/xn4545945  






    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    游戏开发热门技术浅析
    SpringMVC文件分片上传,断点续传
    浏览器文件分片上传,断点续传
    网页文件分片上传,断点续传
    Web文件分片上传,断点续传
    JavaScript文件分片上传,断点续传
    js文件分片上传,断点续传
    html5文件分片上传,断点续传
    vue文件分片上传,断点续传
    csharp文件分片上传,断点续传
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4865177.html
Copyright © 2011-2022 走看看