GCD小结

iOS控制多线程任务数量 iOSGCD控制多线程任务数量,直接使用ZKRGlobalQueue^()。 立即下载

0. Brief Introduction

     GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。

     GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。

     通过与线程池的配合,dispatch queue分为下面两种:

  •      Serial Dispatch Queue -- 线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始。
  •      Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。

1. Basic Management

     我们可以通过dispatch_queue_cretae来创建队列,然后用dispatch_release释放。比如下面两段代码分别创建串行队列和并行队列:

  1. dispatch_queue_t serialQ = dispatch_queue_create("eg.gcd.SerialQueue", DISPATCH_QUEUE_SERIAL);  
  2. dispatch_async(serialQ, ^{  
  3.     // Code here  
  4. });  
  5. dispatch_release(serialQ);  
  6.   
  7. dispatch_queue_t concurrentQ = dispatch_queue_create("eg.gcd.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);  
  8. dispatch_async(concurrentQ, ^{  
  9.     // Code here  
  10. });  
  11. dispatch_release(concurrentQ);  

     而系统默认就有一个串行队列main_queue和并行队列global_queue:

  1. dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. dispatch_queue_t mainQ = dispatch_get_main_queue();  

     通常,我们可以在global_queue中做一些long-running的任务,完成后在main_queue中更新UI,避免UI阻塞,无法响应用户操作:
  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  2.     // long-running task  
  3.     dispatch_async(dispatch_get_main_queue(), ^{  
  4.         // update UI  
  5.     });  
  6. });  
     上面提到dispatch_async这个接口,用来提交blcok给指定queue进行异步执行。这个接口会在成功提交block后立即返回,然后继续执行下去。由于block是定义在栈上的,所以需要将其复制到堆上,见这里。

     与之相对应的是dispatch_sync接口,提交block以供同步执行。这个接口会等到block执行结束才返回,所以不需要复制block。So,如果在调用该接口在当前queue上指派任务,就会导致deadlock。维基百科上给了段示例代码:

  1. dispatch_queue_t exampleQueue = dispatch_queue_create("com.example.unique.identifier", NULL );  
  2. dispatch_sync( exampleQueue,^{  
  3.   dispatch_sync( exampleQueue,^{  
  4.     printf("I am now deadlocked...\n");  
  5.   });});  
  6. dispatch_release( exampleQueue );  
     如果追求的是并发,那么dispatch_sync有什么用呢?关于dispatch_sync的用途,SO上有 讨论 。

     

2. Normal Control

  • dispatch_once

     如果没有记错的话,在iOS Con 2012上,大众点评的同学分享了个Topic叫《iOS开发最佳实践》,开篇讲singleton实现的演进(怎么演进都有可以挑的刺),后面转折说要把精力放到用户看得到的地方。

     如果把singleton和best practice放在一起,那么我很容易联想到dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!

  1. static dispatch_once_t onceToken;  
  2. dispatch_once(&onceToken, ^{  
  3.     // code to be executed once  
  4. });  
  • dispatch_after

     有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用dispatch_after这个函数:

  1. double delayInSeconds = 2.0;  
  2. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);  
  3. dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
  4.     // code to be executed on the main queue after delay  
  5. });  
  • dispatch_set_target_queue

     通过dispatch_set_target_queue函数可以设置一个dispatch queue的优先级,或者指定一个dispatch source相应的事件处理提交到哪个queue上。

  1. dispatch_set_target_queue(serialQ, globalQ);  
  • dispatch_apply

     执行某个代码片段若干次。

  1. dispatch_apply(10, globalQ, ^(size_t index) {  
  2.     // do sth. 10 times  
  3. });  
  • dispatch group

     Dispatch Group机制允许我们监听一组任务是否完成:

  1. dispatch_group_t group = dispatch_group_create();  
  2. dispatch_group_async(group, concurrentQ, blk0);  
  3. dispatch_group_async(group, concurrentQ, blk1);  
  4. dispatch_group_async(group, concurrentQ, blk2);  
  5. dispatch_group_notify(group, mainQ, ^{  
  6.     // update UI  
  7. });  
  8. dispatch_release(group);  

     或者说同步地等待一段时间看是否结束:

  1. dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC);  
  2. dispatch_group_wait(group, time);  
  • dispatch_barrier_async

     通过dispatch_barrier_async函数提交的任务会等它前面的任务执行结束才开始,然后它后面的任务必须等它执行完毕才能开始。

  1. dispatch_async(concurrentQ, blk0);  
  2. dispatch_async(concurrentQ, blk1);  
  3. dispatch_barrier_async(concurrentQ, blk_barrier);  
  4. dispatch_async(concurrentQ, blk2);  

这份官方文档很清晰地按功能为GCD相关函数进行了分类。


IOS 多线程GCD详解 Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。 dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。 #definedispatch_get_main_queue() \DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q) 可以看出,dispatch_get_main_queue也是一种dispatch_queue_t。 2)并行队列global dispatch queue,通过dispa 立即下载

相关推荐

rfid标签技术原理

奇怪的是,RFID标签技术原理的深入剖析不仅揭示了其背后的奥秘,也让我们更加全面地认识到这一技术在数字化转型中的重要性和潜力。随着技术的不断进步和应用场景的不断拓展,RFID标签将在更多领域发挥重要作用,为物联网、智能制造等领域的发展注入新的活力。这意味着在一个读写器的覆盖范围内,可以同时读取多个RFID标签的数据,大大提高了数据收集的速度和效率。:RFID标签的“大脑”,负责存储和处理数据。芯片内部集成了存储器、控制逻辑和射频接口等电路,能够接收来自读写器的射频信号,执行相应的数据处理和通信任务。

x3088的博客 2159

iOS—GCD详解

文章目录多线程编程进程线程线程与进程的关系多线程编程多线程编程的问题GCD什么是GCDGCD任务和队列GCD的使用步骤队列的创建队列的获取任务的创建方法任务与队列不同组合方式的区别同步执行 + 并发队列异步执行 + 并发队列同步执行 + 串行队列异步执行 + 串行队列同步执行 + 主队列在主线程中调用 同步执行+主队列在其他线程中调用 同步执行+主队列异步执行 + 主队列GCD其他方法GCD栅栏方法:dispatch_barrier_asyncGCD延时执行方法:dispatch_afterGCD 一次性代

qq_45836906的博客 6625

学Simulink--决策规划场景实例:基于Simulink的智能车辆行为决策仿真

本文基于Simulink平台构建智能车辆变道决策仿真系统,采用MOBIL算法实现"决策-规划-执行"全流程。系统包含自车动力学模型、环境感知模块(含5%噪声)、决策控制器和轨迹规划模块,通过五次多项式实现平滑变道。仿真验证了三种典型工况:正常变道(成功率100%)、邻车拒绝让行和紧急避障,各项指标均满足要求(TTC>3s,横向加速度<2m/s²,决策周期<100ms)。文章详细介绍了建模步骤、核心算法实现和参数配置方法,并提出了强化学习、多车协同等优化方向。该模型为智能

amy_mhd的博客 153

iOS GCD的基本使用

简而言之,就是 创建任务--创建对列-->把任务放到对列里.同步执行(sync)和异步执行(async)。串行对列,并行对列(注意:并行对列并不是说有多个对列并行,不管串行对列还是并行对列,都只有一个对列,对列里放的任务是串行的,叫串行对列,对列里放的任务是并行的,叫并行对列)所以理论上任务和对列有4种组合方案:1.串行对列里添加同步任务;2.串行对列里添加异步任务;3.并行对列里添加同步任务;

wyz670083956的博客 1831

微信开发 - 最新第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

redirect_uri参数错误,微信第三方登录,没有服务器时的测试方法,微信开放平台的回调域名怎么设置为本地域名IP,微信登录微信支付每次调试都需要放到服务器上怎么办,微信登录支付业务在本地调试不了怎么办,在本地怎么测试微信支付和登录,微信第三方登陆本地测试,怎么在本地进行测试,微信回调域怎么设置为本地IP,微信扫码登录redirect_uri参数错误,微信开放平台,微信开放平台开发的第三方登录和支付,vue2,nuxt2,vue3,nuxt3,uniapp,微信开放平台,公众号,微信支付,微信登录授权,

🏆 前端领域优质创作者 8791

【异常】Error loading ASGI app. Could not import module ‘main‘

出现或。

奶爸的编程之路,也就一周冷个三天 1856

iOS多线程---GCD

Grand Central Dispatch(GCD)是苹果封装的一套C的API,异步执行任务的技术之一。它可以自动管理线程的创建,调度和销毁等功能,无需开发者自己实现。苹果官方对GCD的说明:开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。用于管理追加的Block的C语言层实现的FIFO队列Atomic函数中实现的用于排他控制的轻量级信号用于管理线程的C语言层实现的一些容器。

旭日的博客 1397

基于逆向工程的中国裁判文书网爬虫技术深度解析:从反爬破解到合规抓取

最近承接了一个法律大数据分析的项目,需要获取某类合同纠纷的裁判文书数据,用于分析不同地区的判决规律、法官的裁判倾向以及法条适用情况。原本以为用常规的Python爬虫就能搞定,结果刚对着中国裁判文书网发了几个请求,就遭遇了“滑铁卢”:要么请求直接返回403 Forbidden,要么触发滑块验证码,甚至连IP都被临时封禁了。普通的requests+BeautifulSoup组合在裁判文书网面前完全失效,这也让我意识到,想要获取这里的数据,必须先通过逆向工程拆解网站的请求逻辑和反爬机制。经过一周的摸索,从抓包分析

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3172

GCD详解

一、简介 1、什么是GCD?看看百度百科的定义: GCD为Grand Central Dispatch的缩写。Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。 全称: 它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并行任务。在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用。 设计: GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数.

weixin_40200876的博客 2万+

在 SAP BTP 中玩转工厂日历 Maintain Factory Calendars 实战指南

工厂日历是企业关键的时间主数据,基于国家假日历定义工作日与非工作日,广泛应用于生产计划、采购交期、财务结账等业务场景。SAP系统通过三类应用(维护节假日、假日历和工厂日历)实现分层配置。工厂日历作为顶层配置,支持工作日模式设定和例外规则添加。在多系统架构中,工厂日历可通过集成场景同步,确保数据一致性。应用支持创建、编辑和查看功能,包含有效期设置、例外规则管理和多语言文本维护。合理设置工厂日历对业务运营至关重要,需注意命名规范和有效期选择,避免历史数据问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

压缩包密码破解工具ZIP Cracker2.0.1.2 正式版

一款多功能文件密码破解工具,支持ZIP、RAR、Office等主流加密格式,提供CPU/GPU双模式破解。该软件采用黑客风格界面,具备环境自检修复功能,支持实时监控硬件使用率。内置hashcat等专业破解工具,通过拖拽文件即可快速破解,GPU模式速度可达CPU的10-100倍。最新版本优化了中文路径支持,并提升了启动速度。

bfq05234214的博客 483

【C++】最大公约数GCD、最小公倍数LCM

最大公约数GCD和最小公倍数LCM

2301_81154483的博客 6520

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【iOS】 GCD小结

GCD是iOS开发中非常重要的一个内容,笔者今天对于这部分内容做一个介绍,GCD(Grand Central Dispatch)是Apple开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上,执行的并发任务。线程池模式:线程池工作队列已经装满了,且在线程池中正在运行的线程数小于可最大线程数。

qq_73106050的博客 1579

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GCD的使用小结

GCD的使用小结 GCD中的三种队列类型 The main queue(主线程串行队列) Global queue(全局并发队列) Custom queue

lzylzy1991的专栏 551

[iOS]GCD小结

0. Brief Introduction      GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。      GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。      通过与线程池的配

站在巨人的肩膀上 2万+

iOS GCD 编程小结

一、简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核、四核) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程) 程序员只需要告诉GCD想要执行什么任务,不...

dishu8063的博客 145

GCD 小结

iOS 多线程编程技术 1. Cocoa 封装 Thread : NSThread  轻量级  performselector 2. Cocoa 封装的 NSoperation  3. GCD  grand Central Dispatch 三种编程方式从上到下, 抽象层次从低到高, 也就是 GCD是抽象程度最高的, 所有用起来也是最顺手的;  三种方式的优缺点分析 

jerry129GT的博客 482
上一篇: 内存管理(Core Foundation object和Objective - C转换)__bridge,__bridge_retained和__bridge_transfer
下一篇: autolayout和sizeclass自动布局
Allen_iOS
博客等级 码龄12年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值