初识GCD

本文深入探讨了GCD(Grand Central Dispatch)的概念及其在iOS开发中的应用,包括串行和并行队列的区别、不同类型的队列如何工作,以及如何避免常见的死锁问题。

进程:一个可执行的程序

任务:一块可执行的代码

线程:指的是一个独立的代码执行路径,线程是代码执行路径的最小分支

串行和并行:串行是一次只能执行一个任务,并行是一次能执行多个任务

并行是CPU的多核芯同时执行多个任务  并发是单核CPU交替执行两个任务

GCD中的dispatch queue是FIFO任务队列,一个任务可以是一个函数,也可以是一个block。
GCD即对调度队列的操作,分为两种,serial dispatch queue(连续队列、串行队列)和concurrent dispatch queue(同时发生的、并发队列)队列,正如名字,serial队列只能有一个线程,concurrent队列可以有多个线程,就是说,serial队列里的任务只能给一个线程按顺序执行,concurrent队列里的任务可以分给多个线程执行,而且,执行顺序不定。
  • 串行队列:线程任务按先后顺序逐个执行(需要等待队列里面前面的任务执行完之后再执行新的任务)。
  • 并发队列:多个任务按添加顺序一起开始执行(不用等待前面的任务执行完再执行新的任务),但是添加间隔往往忽略不计,所以看着像是一起执行的。
使用concurrent队列时,GCD会自动创建(或征用)一个线程来运行每一个block,每个block一旦完成该线程就会摧毁或者返回到线程池,使用GCD,你可以专注于队列,让线程池去管理线程。
虽然可以不用手动的管理线程,但是当执行的block超过线程数量时,就会出现问题。
iOS系统提供的两个默认队列,一个是Main dispatch queue,一个是Global dispatch queue,Main queue是serial队列,只有主线程,Global队列是concurrent队列。
最常用的是用dispatch_async(one queue,block);或者dispatch_sync(one queue,block);方法向队列里添加block任务,
dispatch_after(one time,one queue,block)是在time时间后向队列里追加block,注意,这里只是追加,不是执行。
  • The main queue(主线程串行队列): 与主线程功能相同,提交至Main queue的任务会在主线程中执行,
  • Main queue 可以通过dispatch_get_main_queue()来获取。
  • Global queue(全局并发队列): 全局并发队列由整个进程共享,有高、中(默认)、低、后台四个优先级别。
  • Global queue 可以通过调用dispatch_get_global_queue函数来获取(可以设置优先级)
  • Group queue (队列组):将多线程进行分组,最大的好处是可获知所有线程的完成情况。Group queue 可以通过调用dispatch_group_create()来获取,通过dispatch_group_notify,可以直接监听组里所有线程完成情况。

主线程串行队列同步执行任务,在主线程运行时,会产生死锁
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue,^{
NSLog("MainQueue");           
});

程序一直处于等待状态,block中的代码将执行不到
解:dispatch_sync方法将block添加到Main Queue最后,因为Main Queue是严格的FIFO队列,执行完当前的任务才会执行后面的block,但是sync函数又是执行完添加的block才往下执行其他代码,所以产生死锁。
换成async异步调用就不会死锁,异步调用完后通过状态、通知和回调通知调用方执行完成。
GCD常用的几个方法:
dispatch_async/sync:异步/同步得向queue里添加任务;
dispatch_after:






先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...
2026最新微信在线AI客服系统源码 微信客服AI系统是一款基于PHP开发的智能客服解决方案,完美集成企业微信客服,为企业提供7×24小时智能客服服务。系统支持文本对话、图片分析、视频分析等多种交互方式,并具备完善的对话管理、人工转接、咨询提醒等高级功能。 核心功能 ### 1.  智能AI客服 #### 自动回复 - **上下文理解**:系统自动保存用户对话历史,AI能够理解上下文,提供连贯的对话体验 - **个性化配置**:可自定义系统提示词、最大输出长度等AI参数 #### 产品知识库集成 - **公司信息**:支持配置公司简介、官网、竞争对手等信息 - **产品列表**:可添加多个产品,包括产品名称、配置、价格、适用人群、特点等 - **常见问题FAQ**:预设常见问题及答案,AI优先使用知识库内容回答 - **促销活动**:支持配置当前优惠活动,AI会自动向用户推荐 ### 2. 多媒体支持 #### 图片分析 - 支持用户发送图片,AI自动分析图片内容 - 可结合文字描述,提供更精准的分析结果 - 支持常见图片格式:JPG、PNG、GIF、WebP等 #### 视频分析 - 支持用户发送视频,AI自动分析视频内容 - 视频文件自动保存到服务器,提供公网访问 - 支持常见视频格式:MP4、等 ### 3.  人工客服转接 #### 关键词触发 - **自定义关键词**:可配置多个转人工触发关键词(如:人工、客服、转人工等) - **自动转接**:用户消息包含关键词时,自动转接给指定人工客服 - **友好提示**:转接前向用户发送提示消息,提升用户体验 #### 一键介入功能 - **后台管理**:管理员可在对话管理页面查看所有对话记录 - **快速转接**:点击"一键介入"按钮,立即将用户转接给人工客服
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值