zoukankan      html  css  js  c++  java
  • GCD-01(基本使用)

    - (void)viewDidLoad {

        [super viewDidLoad];

        //GCD: Grand Central Dispatch 牛逼的中枢调度器

        //纯C语言, 提供了非常多强大的函数;自动管理线程的生命周期;苹果推荐

        //GCD中两个核心概念

        //1.任务:执行什么操作

        //2.队列:用来存放任务

        

        //GCD的使用步骤

        //1.定制任务--确定想做的事情

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

        

        //GCD中有两个用来执行任务的函数

        //1.用同步的方式执行任务,不具备开启新线程的能力

        //其中的参数为: queue : 队列; block:任务

        //dispatch_sync(dispatch_queue_t queue, <#^(void)block#>);

        //2.用异步的方式执行任务, 具备开启新线程的能力

        //dispatch_async(dispatch_queue_t queue, <#^(void)block#>);

        

        //同步和异步的区别,同步和异步决定了要不要开启新的线程

        //同步:在当前的线程中执行,不具备开启新线程;异步:在另一条线程中执行,具备开启新线程

        

        //并发和串行决定任务的执行方式,同时还是一个一个

        

        //GCD默认已经提供了全局的并发队列供整个应用的使用不需手动创建

        

        //GCD的队列可以分为2大类

        //1.并发队列,可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务),并发只有在异步函数才有效

        //2.串行队列,让任务一个接一个的执行

        

        //[self asyncGlobalQueue];

        

        //[self asyncSerialQueue];

        

        //[self syncGlobalQueue];

        

       // [self syncSerialQueue];

       //[self syncMainQueue];//会死掉

        

        [self asyncMainQueue];

    }

    #pragma mark - 异步

    /**

     * 用dispatch_async异步函数往并发队列中添加任务

     */

    - (void)asyncGlobalQueue {

        //1,获取全局的并发队列

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        //2.添加任务到队列中执行任务

        dispatch_async(queue, ^{

            NSLog(@"1---%@", [NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"2---%@", [NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"3---%@", [NSThread currentThread]);

        });

        //总结:同时开启3个线程

    }

    /**

     * 用dispatch_async异步函数往串行队列中添加任务

     */

    - (void)asyncSerialQueue {

        //1.创建串行队列(GCD中获取串行的两种途径)1:

        dispatch_queue_t queue = dispatch_queue_create("com.guofu.queue", NULL);

        

       //2:使用主队列(跟主线程相关联的队列),主队列是GCD自带的一种特殊的串行队列,放在朱队列中的任务,都会放到主线程中执行

        

        //2.添加任务到队列中执行任务

        dispatch_async(queue, ^{

            NSLog(@"1---%@", [NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"2---%@", [NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"3---%@", [NSThread currentThread]);

        });

        //总结:只开一个线程

        

        //3.如果在非ARC下需要释放资源

        //dispatch_release(queue);

    }

    #pragma mark - 同步

    /**

     * 用dispatch_sync同步函数往并发队列中添加任务

     */

    - (void)syncGlobalQueue {

        //1,获取全局的并发队列

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        //2.添加任务到队列中执行任务

        dispatch_sync(queue, ^{

            NSLog(@"1---%@", [NSThread currentThread]);

        });

        dispatch_sync(queue, ^{

            NSLog(@"2---%@", [NSThread currentThread]);

        });

        dispatch_sync(queue, ^{

            NSLog(@"3---%@", [NSThread currentThread]);

        });

        //总结:不会开启线程,并发队列失去并发功能

    }

    /**

     * 用dispatch_sync同步函数往串行队列中添加任务

     */

    - (void)syncSerialQueue {

        //1.创建串行队列

        dispatch_queue_t queue = dispatch_queue_create("com.guofu.queue", NULL);

        //2.添加任务到队列中执行任务

        dispatch_sync(queue, ^{

            NSLog(@"1---%@", [NSThread currentThread]);

        });

        dispatch_sync(queue, ^{

            NSLog(@"2---%@", [NSThread currentThread]);

        });

        dispatch_sync(queue, ^{

            NSLog(@"3---%@", [NSThread currentThread]);

        });

        //总结:不会开启新的线程

    }

    /*

     同步(sync)函数

     并发队列:不会开线程

     串行队列:不会开线程

     异步(async)函数

     并发队列:可以开启多条线程,取决去任务的个数

     串行队列:开一条线程

    凡是函数名中带有createcopy ew etain.都需要在不需要这个数据的术后进行release

     GCD的数据类型在ARC环境下不需要做release

     CF(core Foundation)的数据类型在ARC下还是要做release

     */

    #pragma mark - 第二种获取串行队列的方式

    /**

     * 用dispatch_sync同步函数,在主线程中往主队列中添加任务

     * 线程会死掉

     */

    - (void)syncMainQueue {

        //1.获取主队列

        dispatch_queue_t queue = dispatch_get_main_queue();

        //2.添加任务到队列中执行

        dispatch_sync(queue, ^{

            NSLog(@"1---%@", [NSThread currentThread]);

        });

        //总结:不会开启新的线程,所有任务在主线程中执行,

    }

    /**

     * 用dispatch_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]);

        });

        //总结:不会开启新的线程,所有任务在主线程中执行,

    }

    /**

     * 下载图片的例子

     */

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_async(queue, ^{

            // 1.根据URL下载图片

            NSURL *url = [NSURL URLWithString:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

            NSData *data = [NSData dataWithContentsOfURL:url]; // 这行会比较耗时

            UIImage *image = [UIImage imageWithData:data];

            //2.回到主线程显示图片

            dispatch_async(dispatch_get_main_queue(), ^{

                self.imageView.image = image;

            });

        });

    }

  • 相关阅读:
    [转]为iPhone4S和iOS5增加全局英汉词典教程
    Notes on MSBuild
    Using jQuery To Manipulate and Filter Data
    使用MSBuild进行自动化构建
    使用ADO.NET的计算列
    来自Twitter的前端工具包——Bootstrap
    Jquery Templetes简介
    C#导入导出Excel
    Mysql在sql中截取时间类型字段的年月日和时间
    使用NPOI导出Excel,并在Excel指定单元格插入图片
  • 原文地址:https://www.cnblogs.com/guofuzhang/p/5195829.html
Copyright © 2011-2022 走看看