iOS基础-0x00 GCD

2023-11-07

一、什么是GCD?

Grand Central Dispatch 是异步执行任务的技术之一。 使用了简洁的方法,实现了极为复杂的多线程编程

GCD 的常用API

1、 认识队列 1)串行队列和并发队列
串行队列:FIFO,后面一个等上一个任务完,只可用于一个线程。
并发队列:可以随意取,不按照顺序, 可以用于多线程

dispatch_queue_t dispatch_queue_create(const char *_Nullable DISPATCH_UNSAFE_INDEXABLE label,
  dispatch_queue_attr_t _Nullable attr);
  // label: 是队列标识 
  // attr : 设置生成队列的属性,是串行还是并发

2)Main Dispatch Queue(主队列)/ Global Dispatch Queue(全局队列)
主队列: 主线程队列,将用户界面等一些必须在主线程执行的处理追加到主队列中。
全局队列: 所有应用程序都能够使用的并发队列,可以设置等级,高->低【4级】。


0x01: void dispatch_set_target_queue(dispatch_object_t object,dispatch_queue_t _Nullable queue)

1)不管是串行队列还是并行对垒,都使用了与全局队列相同的优先级,这个方法变更了队列执行的优先级。
参数一: 指定要变更优先级的队列 参数二: 指定要使用的优先级的队列,也就是让第一个参数和第二个参数的优先级一样。

2)扩展使用:对队列进行设置优先级阶层。通过设置队列的依赖关系而实现的执行阶层 —— 可以防止并行执行。

如果多个串行队列中用该函数指定目标位某个串行队列,那么原本应并行执行的多个串行队列,在目标这些串行队列只能同时执行一个处理。

0x02: void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);

并不是在指定时间后执行处理,而是在执行时间追加处理到Dispatch Queue 中。

常使用场景: 就是我们想在3秒之后再主线程中执行某个任务。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  // do code 
});

0x03: dispatch_group_t

多个处理结束之后,再处理的事情。 常常使用的场景就是多个网络请求之后,再重新组装数据。

0x04:dispatch_barrier_async

执行栅栏, 主要是为了分割执行代码块。

常常使用的场景:访问数据库或者文件,使用串行队列,可以避免数据竞争的问题。 因为写入数据确实不可与其他的写入处理以及包含读取处理的其他某些处理并行执行。但是如果是读取处理只是与读取处理并行执行,那么多个并行执行就不会发生问题。

为了搞笑的访问,读取处理追加到并发队列中,写入处理在任一个读取没有执行的状态下,追加到串行队列中即可

0x05:dispatch_sync

同步处理, 用于同步队列执行任务

0x06: dispatch_async

异步处理,用于异步执行队列任务。

0x07:dispatch_apply

按指定的次数将指定的block追加到指定的Dispatch Queue中,并等待全部处理执行结束。

是和dispatch_sync和dispatch group 有关联的API。

0x08: dispatch_suspend/dispatch_resume

希望不执行已追加到queue中的处理。 具有暂停/恢复 执行的作用。

0x09: dispatch semaphore

GCD 中实现的信号量,用来控制线程同步的问题。

0x10: dispatch_once

保证在应用程序中只执行一次指定处理的API。

常用于创建一个单例。

Dispatch I/O 提高文件的读取速度

已经常想的是:在读取大文件时候,如果将文件分成合适的大小并使用Global Dispach Queue并列读取的话,应该会比一般的读取速度快不少。

现今的输入/输出硬件已经可以做到一次使用多个线程更快的并列读取了。 就是dispatch I/O


GCD 是如何实现的?

Disaptch Queue Dispatch Source

本文由 mdnice 多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS基础-0x00 GCD 的相关文章

随机推荐

  • JDK版本导致Unsupported major.minor version 52.0 error

    出现问题原因 gt gt 分析 JDK版本不一致的问题 在eclipse中开发的项目有个Java build path中可以配置的JDK java compiler中可以配置compiler level eclipse gt windows
  • Docker客户端的常用命令

    搬运地址 启动Docker systemctl start docker 帮助命令 docker版本 docker version docker信息 docker info 帮助文档 docker help 此命令会列出所有Docker命令
  • Vue 中渲染字符串形式的组件标签

    在vue中如果要渲染字符串形式的标签 vue 提供了 v html 指令 可以很方便的渲染出来 但是如果这个标签是一个组件 或者element ui 的组件时 就不能解析出来了 因为v html 只能解析原生的属性 那么就要使用jsx渲染来
  • VS2005发布网站时生成的DLL名称问题

    VS2005发布网站时不会像VS2003一样生成规则的DLL文件 而生成的DLL文件名含有随机数且不能一个项目生成一个DLL文件 让人有一些遗憾 为了做到像vs2003一样 微软发布了WebDeployment Project插件可解决此问
  • 【STM32】端口复用和重映像

    作者 一只大喵咪1201 专栏 STM32学习 格言 你只管努力 剩下的交给时间 端口复用和重映像 描述 端口复用 端口复用的配置过程 端口重映像 部分重映像和完全重映像 重映像的配置过程 总结 描述 先来看一张STM32的简易结构图 在图
  • 程序员须学计算机语言,IT程序员入门必须要学会的是什么?

    IT程序员入门必须要学会的是什么 入门需要具备一定的英语基础 计算机体系结构和汇编语言 计算机操作系统原理 数据结构和算法 软件工程 Windows程序设计等相关知识点 一 具备一定的英语基础 对于初级程序员来说 英语只需要写简单的词汇就可
  • QT---FTP练习,连接FTP服务器,浏览其中的文件,下载到本地目录中

    include mainwindow h include ui mainwindow h include include include include include MainWindow MainWindow QWidget paren
  • 手机定位浅析 AGPS定位 LBS基站定位 卫星定位

    手机定位是指通过特定的定位技术来获取移动手机或终端用户的位置信息 经纬度坐标 在电子地图上标出被定位对象的位置的技术或服务 定位技术有两种 一种是基于GPS的定位 一种是基于移动运营网的基站的定位 基于GPS的定位方式是利用手机上的GPS定
  • Ubuntu rc.local 的开启与配置

    目录 rc local 简介 rc local 的配置流程 rc local 服务的管理 rc local 服务显示状态 rc local 服务的启动 rc local 服务的停止 rc local 服务使能 gt 开机依旧生效 rc lo
  • 如何在 Cockpit 中管理虚拟机

    Cockpit 是一个很将整个服务器置于一个集中的控制面板中 并对它们进行相当程度的控制 还可以在Cockpit中创建和管理虚拟机 环境 Centos8 安装Cockpit 要使用 Cockpit 创建和管理虚拟机 必须在运行 Cockpi
  • Web前端学习:JavaScript基础 【HTML DOM操作】

    目录 一 认识DOM Document 二 查找HTML元素 1 查找HTML元素的方式 以id查找HTML元素为例 编辑 window onload方法 三 DOM 常用事件 1 DOM常用事件表 2 DOM 常用事件的用法 以oncli
  • 音视频技术学习博客

    云天之巅 http blog yundiantech com log blog 音视频同步 https blog csdn net myvest article details 97416415
  • 查看docker日志的方法

    查看docker日志的几种方法 1 实时查看日志 2 查看某一段的日志 3 容器是否启动成功 4 查看某个日期至今的所有日志 并持续打印 docker logs OPTIONS CONTAINER OPTIONS说明 f 跟踪日志输出 si
  • MySQL数据库增添改删数据

    DDL 表结构 create alter drop DML 表内容 insert update delete 添加 修改 删除 DQL select from 表名 代表所有的字段 投影操作 select from 表名 where id
  • 有意思的可变数组依据tomcat生命周期的lifeSupport

    依据tomcat源码中的LifecycleSupport addLifecycleListener package com array public class ArrayTest private static String str1 ne
  • Node.js vs PHP-哪一个更适合2021年?

    无论何时我们要开始一些业务 最主要的关注是选择最好的编程语言 它可以同时构建高性能和可伸缩性的项目 有时候 你会陷入两种语言之间 很难找到最好的一种语言 选择最佳的编程工具对于企业的成功是非常重要的 您需要选择最好的编程语言 同时开发和设计
  • centos部署vue项目

    https www cnblogs com alvin niu p 9502286 html
  • DBeaverUltimate中文多连接数据库SQL 编辑查询

    DBeaverUltimate是很受欢迎的数多连接据库管理工具 对于目前比较流行的数据库都是可以使用的 专业人士也可以使用DBeaverUe使用 而且无论是MySQL还是SQLite 亦或者是PostgreSQL Oracle Micros
  • C/C++中的分配内存初始化(new和malloc)

    1 new和delete以及new 和delete include
  • iOS基础-0x00 GCD

    一 什么是GCD Grand Central Dispatch 是异步执行任务的技术之一 使用了简洁的方法 实现了极为复杂的多线程编程 GCD 的常用API 1 认识队列 1 串行队列和并发队列 串行队列 FIFO 后面一个等上一个任务完