博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD详细用法
阅读量:4877 次
发布时间:2019-06-11

本文共 2027 字,大约阅读时间需要 6 分钟。

 

一、延迟执行
1.介绍
第一种方法,该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。

[self performSelector:@selector(run) withObject:nil afterDelay:3.0];

说明:在3秒钟之后,执行run函数

 

第二种方法,什么时间,执行这个队列中的这个任务。如果队列是主队列,那么就在主线程执行,如果队列是并发队列,那么会新开启一个线程,

                     在子线程中执行。

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

       //延迟执行的方法

    });

说明:在5秒钟之后,执行block中的代码段。

参数说明:

 

二、一次性代码

1、使用dispatch_once创建一次性代码,整个程序运行过程中,只会执行一次

     使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次

     static dispatch_once_t onceToken;

     dispatch_once(&onceToken, ^{

         // 只执行1次的代码(这里面默认是线程安全的)

     });

  

三、基本用法

1、主队列(串行队列):是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。

      提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程。

获取主队列的方式:

 dispatch_queue_t queue=dispatch_get_main_queue();

(1)使用异步函数执行主队列中得任务:

     dispatch_async(queue, ^{

           NSLog(@"使用异步函数执行主队列中的任务1--%@",[NSThread currentThread]);

       }); 

(2)使用同步函数,在主线程中执行主队列中得任务,会发生死循环,任务无法往下执行。所以禁止在主线程中执行同步函数,示意图如下:

 

  

2、全局队列(并发队列)  GCD在每个应用程序都一个全局队列,所以不需要创建并发队列,可以直接使用

    
  提示:同步函数不会新建线程,异步执行可能会新建N条线程
 

获取一个全局串行队列 

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 30//2.把任务添加到队列中执行31
(1) 异步执行
        dispatch_async(queue, ^{
       异步执行的代  });
 
(2)同步执行
          dispatch_sync(queue, ^{
       NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);    });
 
2、新建队列(串行队列)
    
  提示:
同步函数不会新建线程,异步执行会新建1条线程,需要执行的异步代码放在新建的子线程,但是任然会串行执行
 
 

新建串行队列

      dispatch_queue_t queue = dispatch_queue_create("zhufeidong", NULL); // 创建串行队列

      dispatch_release(queue);             // 非ARC需要释放手动创建的队列

(1) 异步执行
        dispatch_async(queue, ^{
       异步执行的代  });
 
(2)同步执行
          dispatch_sync(queue, ^{
       NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);    });
 
2、队列组

步骤:

(1)创建一个组:dispatch_group_t group =  dispatch_group_create();

(2)任务1:dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                                                                // 执行1个耗时的异步操作

                         });

(3)任务2:dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                                                 // 执行1个耗时的异步操作

                        });

(4)执行完毕之后:dispatch_group_notify(group, dispatch_get_main_queue(), ^{

                                               // 等前面的异步操作都执行完毕后,回到主线程...

                         });

 

转载于:https://www.cnblogs.com/hepingqingfeng/p/5457682.html

你可能感兴趣的文章
【Spark】编程实战之模拟SparkRPC原理实现自定义RPC
查看>>
关于Setup Factory 9的一些使用方法
查看>>
接口实现观察者模式
查看>>
网站Session 处理方式
查看>>
记开发个人图书收藏清单小程序开发(九)Web开发——新增图书信息
查看>>
四则运算完结篇
查看>>
poj3401二分图
查看>>
Objective-C中的类目,延展,协议
查看>>
Python标准模块--Iterators和Generators
查看>>
Introduction Sockets to Programming in C using TCP/IP
查看>>
PHP 简单实现webSocket
查看>>
zookeeper部署搭建
查看>>
navigationController pop回之前控制器
查看>>
汇编语言实验一
查看>>
Web.config配置文件详解(新手必看)
查看>>
selenide总结
查看>>
selenium--控制浏览器和简单元素操作
查看>>
[笔记] imooc《JavaScript深入浅出》对象与函数
查看>>
hdu1078FatMouse and Cheese
查看>>
jquery 处理密码输入框(input type="password" ) 模仿placeholder
查看>>