Grand Central Dispatch =GDC
1.有两种,顺序的serial Dispatch Queue 与 并发的Concurrent Dispatch Queue
前者是所有加入这个queue的block会顺序执行,完成一个在开始第二个。既此队列只开一个线程顺序执行。
后者是所有加入这个queue的block会并发执行,第二个的开始与第一个是否结束无关,他会选择最有解决线程创建方案,不会每个block创建一个线程(比如b1,b2,b3当要执行b3的时候,b1执行完了,此时b3会加入b1的线程而不会重新创建)。
2.创建方式
dispatch_queue_t xxx = dispatch_queue_create("queueName",Null) //这个是创建了serial Dispatch Queue
dispatch_queue_t xxx = dispatch_queue_create("queueName",DISPATCH_QUEUE_CONCURRENT);//这个是创建concurrent dispatch queue
需要人工release
3.Main Dispatch Queue/Global Dispatch Queue
Main Dispatch Queue 主线程队列 加入次线程的都会在主线程进行执行,既丢入NSRunLoop里。一般需要刷新页面相关的才会使用。
Global Dispatch Queue 是做一个快速获取的Concurrent dispatch queue存在的,他有4个优先级 background,low,default,high
注意:使用MainDQ 和 GlobalDQ 是不需要进行retain 或release的
4.dispatch_set_target_queue
设置队列优先级。
dispatch_set_target_queue(Q1,Q2);
Q1为需要修改优先级的,Q2为Q1要与他同级的。
MainDQ 与GlobalDQ因为是全局 所以无法作为第一个参数。
在必须将不可并行的处理追加到多个serial Dispatch Queue 中时,如果使用dispatch_set_target_queue函数将目标指定为某一个serialDispatchQueue即可防止处理并行执行。
5.dispatch_after 与 dispatch_walltime
dispatch_after 为延迟多久加入队列(相对时间)
dispatch_walltime 为在什么时间加入队列(绝对时间)
ex:
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(),^{…});
dispatch_time_t 是从第一个参数的时间开始,经历第二个参数的市场之后。
ull 是C语言数值字面量
NSEC_PER_SEC为秒为计数单位
NSEC_PER_MSEC为毫秒的计数单位
dispatch_walltime 返回的为dispatch_time_t 书p155
*6.Disptach Group
将dispatch 加入group,并且设置执行group队列完后的执行代码。
ex:
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_DEFAULT,0);
dispatch_group_t group=disptach_group_create();
dispatch_group_async(group,queue,^{1...});
dispatch_group_async(group,queue,^{2...});
dispatch_group_async(group,queue,^{3...});
dispatch_group_notify(group,dispatch_get_main_queue(),^{结束后执行的});
dispatch_release(group);
注意:在dispatch_group_notify函数中不管指定怎么样的Dispatch Queue,属于Dispatch Group的处理在追加的block(上面例子的【结束后执行的】)时都已经结束。
另外还有dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
这个表示 调用他的线程永远等待(因为第二个参数DISPATCH_TIME_FOREVER,如果是其他ex:disptach_time_t time=dispatch_time(DISPATCH_TIME_NOW,1ull*NSEC_PER_SEC);
dispatch_group_wait(group,time);
的话就是等待1秒)
long result=dispatch_group_wait(……);
返回值为long型
if(result==0){
// 等待时间结束后,group的全部处理执行结束
}else{
// 等待时间结束后,group的还有未完成的处理
}
正常情况下不适用dispatch_group_wait,而使用dispatch_group_notify(group,dispatch_get_main_queue(),^{结束后执行的});
可以更好的简化代码。
7.dispatch_barrier_async
为了规避Concurrent dispatch queue使用中的并发读取数据,数据竞争等问题。
使用dispatch_barrier_async
ex:
queue 为Concurrent dispatch queue
queue 其他处理1
queue 其他处理2
dispatch_barrier_async(queue,blk_for_writing)
queue 其他处理3
queue 其他处理4
其他处理1 2 执行完 才会执行dispatch_barrier_async,dispatch_barrier_async执行完才会执行 其他处理 3 4
如果其他处理都是数据库读操作 dispatch_barrier_async是数据库写操作,那么这样能保证 3 4 读取的数据是修改(写入)后的,数据保持正确。
8.dispatch_sync
同步执行,与dispatch_async相反。此方法不能将block加到,mainQueue中,会导致死锁。也不能给Serial Dispatch Queue增加block,也会导致死锁。
简单的说这个一般不用,用只用在Concurrent dispatch queue中。(其实一般不会用到)
9.dispatch_apply
重复执行block,x次。
ex: dispatch(10,queue,^{…block…});
NSlog(@“done");
重复执行block 10次,并且等待执行结束后才继续执行NSlog(@“done”)。
注意:dispatch_apply([array count],queue,^(size_t index){…block…});
size_t index代表数组下标,上面代码会将数组array的每个下表都丢入block中执行一次。
10.dispatch_suspend/dispatch_resume
dispatch_suspend 挂起已经追加的处理(未执行的处理暂不执行)
dispatch_resume 恢复已经追加的处理
11.Dispatch Semaphore
代码性排他,通过计数器来限制当前代码在执行过程中只能有限的线程数执行。
创建:dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);
创建一个dispatch_semaphore_t 并且初始化计数为1;
等待(此代码后开始限制线程(排他),加锁,并且计数-1)。
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
排他控制结束(解锁,并且计数+1)
disptach_semaphore_signal(semaphore);
12.Dispatch_once
保证在应用程序执行过程中只执行一次的指令。
static dispatch_once_t pred;s
dispatch_once(&pred, ^{……});
13.Dispatch I/O
通过使用Dispatch I/O可以并发读写数据,提高效率 p167
14.dispatch_queue 与 dispatch_source
是无法中断的,要么使用内部标志位。
而dispatch_source 并且可以设置回调的cancel block。
相关推荐
TI理想二极管在冗余电源中应用实例
深入探讨理想二极管如何提升冗余电源系统的效率与可靠性,通过实际应用案例展示其在电流隔离和自动切换中的优势,帮助工程师优化电源架构设计。
GCD梳理汇总
GCD简介 Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。 基本概念 进程:进程(Process)...
Synopsys Sentaurus TCAD新手教程:从零开始仿真trench MOSFET(附完整代码解析)
本文提供Synopsys Sentaurus TCAD新手教程,详细讲解从零开始仿真trench MOSFET的全过程,包括环境搭建、外延生长、沟槽刻蚀、栅极形成等关键步骤,并附完整代码解析。通过实际案例帮助半导体工程师掌握Sprocess操作技巧,优化工艺参数设置,提升仿真效率。
GCD实践——GCD线程组
在我们实际的开发中,我们往往有这样的需求,就是需要先执行完线程1,再执行线程2,当前面两个线程执行完毕之后,才能去执行线程3.这个逻辑如果使用线程组来实现就会显得非常方便。现在我将会来实现这个案例。代码我会放在github ,的GCD03中。 (1)同样也需要导入GCD源码。然后在ViewController中实现如下: #import "ViewController.h" #impo
别再只调API了!深度拆解Dify文件上传的两种传参方式(sys.file vs. inputs.upload_file)
本文深度解析Dify平台文件上传的两种传参方式——sys.file与inputs.upload_file,详细对比其设计原理、技术实现及适用场景。通过代码示例和性能分析,帮助开发者在本地大模型应用中做出精准技术选型,提升文件处理效率与系统稳定性。
单片机设计具备断电记忆功能的计时器
本文介绍了如何设计一款具备断电记忆功能的计时器,利用单片机和EEPROM存储器实现了计时器值的保存和恢复。当然,在实际的设计中还需要考虑其他因素,如电源管理、时钟精度等,以确保计时器的正常运行和准确性。选择合适的单片机:在设计计时器时,我们需要选择一款具备存储功能的单片机,以便在断电后能够保存计时器的状态。可以优化显示方式,使用更加直观的界面来展示计时器的值;函数中,我们首先从 EEPROM 中读取计时器的初始值,然后在一个无限循环中每秒钟增加计时器的值,并将新的值写入 EEPROM 中。
IOS-GCD中的Timer
- (IBAction)gcdResourceTestBtnPressed:(id)sender { /// 初始化一个gcd队列. dispatch_queue_t timerQueue = dispatch_queue_create("timerQueue", 0); /// 创建 gcd timer. _timerSource = dispatch_
EB配置I2c - 实现与PF8200的读写操作
①,基于硬件实现IIC通信(硬件GPIO引脚配置为I2c复用引脚)②,基于软件模拟IO实现IIC通信(代码控制SDA和SCL两个IO引脚的电平来模拟IIC时序)本文章基于64pin的恩智浦S32K146型号的芯片作为主机,从机是NXP的供电芯片。在本次实验中,我们将以使用EB工具链来配置硬件IIC通信。1,EB配置2,代码编写3,测试验证话不多说,走你~写操作比较简单,只需要申明一个I2c配置结构体变量即可。
最老程序员创业开发实训8---IOS---在Swift中用定时任务显示Splash页面
在上一节中,我们用Swift实现了Splash页面的显示,但是仅仅显示Splash页面是不够的,我们需要显示Splash页面2秒,然后跳转到下一个页面,因此需要实现定时任务的功能。在Android中,我们采用了系统的函数postDelayed来实现这一功能,在IOS系统中,我们需要使用GCD。
基于YOLOv8的野生菌菇检测、识别与分类系统
YOLOv8是YOLO系列模型的最新版本,继承了YOLO系列高效、精确的特点。YOLOv8采用了新的网络架构,并优化了推理速度和检测精度。与传统的目标检测算法(如Faster R-CNN)不同,YOLO模型通过一次前向传播同时完成目标定位与分类,因而具有非常高的计算效率。
Calibre :Standard Verification Rule Format(SVRF) Manual (1-2)
摘要:SVRF规则文件是用于Calibre和ICverify工具的脚本文件,包含层定义、规则检查、注释、预处理指令等元素。规则文件支持全局/局部层定义、隐式层操作,以及条件编译指令(#DEFINE/#IFDEF等)。宏功能(DMACRO/CMACRO)可实现代码复用,支持参数化层操作和嵌套调用。预处理指令支持版本控制(#IFDEFCALIBRE_VERSION)和环境变量默认值设置(#PRAGMAENV)。宏中的层名具有局部作用域,可通过特殊语法实现全局层名指定,LOCAL()修饰符可创建调用作用域内的唯一
iOS 多线程面试题(GCD任务执行顺序)
GCD任务执行顺序 1、串行队列先异步后同步 dispatch_queue_t serialQueue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL); NSLog(@"1"); dispatch_async(serialQueue, ^{ NSLog...
DB文件在编程中的作用及示例代码
通过使用DB文件,我们可以实现数据的持久化存储,并能够高效地进行数据的增删改查操作。在本文中,我们以SQLite数据库为例,演示了如何使用Python语言创建和操作DB文件的示例代码。在实际的编程中,我们可以根据具体的需求和使用的数据库系统来进行更复杂的操作和优化。通过使用DB文件,我们可以实现数据的持久化存储,确保数据在程序关闭后也能被保留,并且能够高效地进行数据检索和更新。在本文中,我们将探讨DB文件的作用,并提供一些示例代码展示如何在编程中使用DB文件。上述代码中,我们使用SQLite提供的。
iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
介绍:Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。设计:GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。一个任务可以是一个函数(f
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
iOS Grand Central Dispatch(GCD)
引言: GCD的全称是Grand Central Dispatch,是苹果在iOS4.0发布的一套处理并发运算方面的API.其用途是为了提高处理器多核运算的能力. GCD有点像NSOperationQueue,它们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行,但GCD比之NSOpertionQueue更底层更高效。 GCD的工作原理:
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
IOS学习之十七:Grand Central Dispatch(GCD)编程基础
有过编程经验的人,基本都会接触到多线程这块。 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现。 同样在,在ios移动开发和Android基本是很类似的一种模型。 但是很多时候,在应用开发中,我们会发现本身并没有自己编码去处理一些并发的事件,去开辟新的子线程等等。 (虽然一般的调用sdk发起一个网络请求,系统都是会默认给你新起一个线程去处理的)
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
gcd其全称(Grand Central Dispatch) 那到底什么叫gcd,官方的解释如下
gcd其全称(Grand Central Dispatch) 那到底什么叫gcd,官方的解释如下: Grand Central Dispatch (GCD) comprises language features, runtime libraries, and system enhancements that provide systemic, comprehensive i
OC高级编程 第3章:Grand Central Dispatch
Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用中记述线程管理用的代码在系统级中实现。开发者只要定义想执行的任务并追加到Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可以执行任务,这样就比以前的线程更加有效率。也就是说GCD用简洁的记述方法,实现了极为复杂繁琐的多线程编程。上面的就是在后台线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。
[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)
[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)参考书籍:《Effective Objective-C 2.0》 【英】 Matt Galloway先睹为快41.多用派发队列,少用同步锁42.多用GCD,少用performSelector系列方法43.掌握GCD及操作队列的使用时机44.通过Dispatch Group机制,根据系统资源状况来执行任
[OC学习笔记]Grand Central Dispatch
继续学习GCD
GCD Grand central Dispatch
上一章我们讨论了iOS中的网络部分的进程线程多线程的相关知识,并且初步了解了NSThread的操作。但是NSThread是有问题的。比如在某个实例,我们需要在当tableView 中显示许多的cell,而cell上是来自网络加载的图片数据。那么我们需要在代理方法中调用cell的时候对imageView添加图片。传统的UIImageView的setImage方法是在主线程中执行的。图片...
Grand Central Dispatch(GCD)初探
GCD提供和管理一些先进先出队列,你的应用程序可以以块的形式向这些队列提交任务。提交给队列的块在一个完全由系统维护的线程池上执行。线程对于运行在其上的任务并不作出任何保证。(No guarantee is made as to the thread on which a task executes.) GCD 提供了三种队列: 主队列 Main: tasks execute
iOS之Operation Queues 和 Grand Central Dispatch
Operation Queues vs. Grand Central Dispatch (GCD)本文主要介绍了iOS中两个比较常用的两种提高应用程序并发性的方法:Operation Queues 和 Grand Central Dispatch (GCD),以下是本文的内容提纲: 基本概念 Operation Queues Grand Central Dispatch 两种并发方式的比较 基本概
Swift GCD(Grand Central Dispatch)探索
在串行队列中,任务必须一个接一个地执行,因此这种队列适用于需要顺序执行任务的场景,比如在某个任务完成后执行另一个任务。并发队列可以同时执行多个任务,但是任务的执行顺序并不一定按照添加到队列中的顺序,而是取决于系统资源的可用性和任务的优先级。同步执行是在当前线程中执行任务,异步执行是在后台线程中执行任务,而栅栏执行可以在任务执行前和执行后插入其他任务。中执行的任务都将在主线程上执行,如果在主线程中执行较耗时的任务,可能会导致 UI 卡顿,因此需要将这些任务放在后台线程中执行。
iOS GCD(Grand Central Dispatch)
iOS 常用有三种线程管理方式,分别是与,现在我们先来了解一下其中的 GCD串行与并行针对的是任务队列,而同步与异步,针对的则是线程。自定义串行队列有能力启动主线程和后台线程(只能启动一个后台线程),不会发生死锁。同步任务,会自动安排在主线程执行;遇到异步任务,自动安排在后台线程执行,所以不会死锁。
987



被折叠的 条评论
为什么被折叠?



