多线程开发(GCD)

深入理解iOS GCD多线程开发 htmltable {th, td {th {pre {简介:本文深入探讨了iOS GCD的多线程开发,包括其核心概念、任务提交方式、主队列的特性、其他高级特性以及在实际开发中的应用。GCD是Apple的多线程解决方案,支持串行和并行队列,并提供全局队列、栅栏、延时执行和一次性执行等特性。开发者能够通过GCD高效管理并发任务,提升应用性能和响应速度,同时避免竞态条件和资源泄漏等问题。 阅读详情

1、GCD

Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。

GCD好处

* GCD 可用于多核的并行运算;
* GCD 会自动利用更多的 CPU 内核(比如双核、四核);
* GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);
* 程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码。需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码。

队列和任务

任务通俗点是指需要执行的代码块,队列是指就是排队。他们关系就是代码块排队等着被执行。

同步队列执行和异步执行

同步执行 是指大家都的排在同一个队被执行,只有上个执行完后才能执行下个。异步执行,是指对队中可以同时执行多个任务,不需要等待上个任务就可以执行下个任务,异步有开启多个线程处理任务的能力。

用法

// 队列创建

// 主队列的获取方法
dispatch_queue_t queue = dispatch_get_main_queue();
// 全局并发队列的获取方法
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 串行队列的创建方法
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
// 并发队列的创建方法
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);

// 任务创建
// 同步执行任务
dispatch_sync(queue, ^{
 // todo
});
// 异步执行任务
dispatch_async(queue, ^{
 // todo
});

线程的使用需要注意死锁等相关问题

其他GCD方法

栅栏方法:dispatch_barrier_async

// 隔离两组并发队列的执行,只有执行了dispatch_barrier_async前加入的任务才会执行接下来的任务
- (void)barrier {
    dispatch_queue_t queue = dispatch_queue_create("com.cnxq.queue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{
        // 追加任务 1
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
    });
    dispatch_async(queue, ^{
        // 追加任务 2
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
    });

    dispatch_barrier_async(queue, ^{
        // 追加任务 barrier
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"barrier---%@",[NSThread currentThread]);// 打印当前线程
    });

    dispatch_async(queue, ^{
        // 追加任务 3
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"3---%@",[NSThread currentThread]);      // 打印当前线程
    });
    dispatch_async(queue, ^{
        // 追加任务 4
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"4---%@",[NSThread currentThread]);      // 打印当前线程
    });
}

延时执行方法:dispatch_after ,只执行一次:dispatch_once,快速迭代方法:dispatch_apply,快速迭代方法:dispatch_apply

// 2.0f s后执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"after---%@",[NSThread currentThread]);  // 打印当前线程
    });

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 这里只会被执行一次
    });

    // block 会类似异步执行,但是会等待所有的执行完毕后才退出循环
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    NSLog(@"egin");
    dispatch_apply(10, queue, ^(size_t index) {
        NSLog(@"%zd---%@",index, [NSThread currentThread]);
    });
    NSLog(@"end");

队列组:dispatch_group,dispatch_group_notify

NSLog(@"currentThread---%@",[NSThread currentThread]);  // 打印当前线程
    NSLog(@"group---begin");

    dispatch_group_t group =  dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("com.cnxq.queue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_group_async(group, queue, ^{
        // 追加任务 1
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
    });

    // 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    dispatch_group_async(group, queue, ^{
        // 追加任务 2
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等前面的异步任务 1、任务 2 都执行完毕后,回到主线程执行下边任务
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"3---%@",[NSThread currentThread]);      // 打印当前线程

        NSLog(@"group---end");
    });

信号量:dispatch_semaphore,通俗解释将异步执行任务转换为同步执行任务

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block int number = 0;
dispatch_async(queue, ^{
	// 追加任务 1
	[NSThread sleepForTimeInterval:2];              // 模拟耗时操作
	NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
	number = 100;
	dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

这里有一个iOS开发交流群:130595548!如果你也是一个有梦想的iOS开发者,欢迎你的加入!

数据分享|1961-2017年中国0.25°×0.25° 逐日地表水文数据集(VIC-CN05.1) 其中,全球径流中心(University of New Hampshire and Global Runoff Data Centre, UNH/GRDC)的复合产流场集成了观测的河道径流和水量平衡模式模拟的地表和地下径流,常被用来评估模拟的径流。在长白山、海北灌丛和千烟洲通量站,模拟与观测的逐月潜热通量的平均NSE为0.61。VIC-CN05.1受益于较准确的大气驱动场、先进的地表水文参数化方案以及更真实丰富的土壤信息,可作为中国水文气象研究的参照数据,用于陆面模式的评估和长期的趋势分析等。 阅读详情

相关推荐

YOLOv11n-seg 实战指南:从训练到模型部署的完整流程

本文提供了YOLOv11n-seg实例分割模型从环境准备、数据标注到模型训练、验证及最终部署的完整实战指南。详细讲解了如何准备多边形掩码数据、配置关键训练参数、解读分割核心评估指标,并重点介绍了将模型导出为ONNX等格式进行部署的流程与优化技巧,帮助开发者高效完成从开发到生产的全链路实践。

weixin_29062255的博客 554

iOS开发—使用GCD实现多线程

GCD是苹果公司为多核的并行运算提出的解决方案,工作时会自动利用更多的处理器核心。使用GCD,系统会完全管理线程,开发者无需编写线程代码。 GCD是Grand Central Dispatch 的缩写,它是基于C语言的。GCD会负责创建线程和调度学要执行的任务,由系统直接提供线程管理。GCD有两个核心概念:队列和任务。 1、队列 Dispatch Queue(队列),它是一个用来存放任务的集

shichunxue的博客 565

用Quartus II和LPM_ROM手把手复现西电计组课设:从微指令到五条指令的完整流程

本文详细介绍了使用Quartus II和LPM_ROM复现西电计组课设的完整流程,从微指令编写到五条指令的实现。通过环境搭建、LPM_ROM配置、微程序设计及调试技巧,帮助读者高效完成课程设计,避开常见问题。适合计组课程设计的学习者和实践者参考。

weixin_29288313的博客 457

多线程开发之三 GCD

NSThread、NSOperation、GCD 总结: 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU 空闲时就会执行) 更新 UI 应该在主线程(UI 线程)中进行,并且推荐使用异步调用,避免造成线程阻塞,常用的方法如下: - (void)performSelectorOnMainThread:(SEL)aSele...

weixin_30514745的博客 283

QT+QTimer+QThread实现线程内的定时任务并且和主线程进行交互

在制作qt软件时,我们经常会用到qtimer定时器以及将其在非主线程中进行使用,甚至有的时候还需要和主线程进行交互。我总结了两种用法,仅供参考。以上即为QTimer和QThread联合使用的学习记录。

u011826081的博客 5685

pytorch超详细安装教程,Anaconda、PyTorch和PyCharm整套安装流程

本文介绍基于Anaconda环境以及与PyCharm结合,安装PyTorch深度学习框架。

Bluebro的博客 19万+

iOS开发之多线程技术(NSThread、OperationQueue、GCD)

在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西。其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的,今天就做一个小的demo来详细的了解一下iOS中的多线程的东西。可能下面的东西会比较枯燥,但还是比较实用的。   多线程用的还是比较多的,废话少说了,下面的两张截图是今天我们实验的最终结果,应

风的坚持 3772

LVGL实战 透视卡盘

八张卡立在一个圆柱面上,摄像机在柱心前方。每帧对屏幕上的每个像素发一条射线,与卡片所在平面求交,得到三维交点,再投影回卡片自己的二维坐标系取样。透视、倾斜、近大远小、相互遮挡 —— 全部是这一步的副产物。

摸鱼专家 55

ios开发进阶之多线程01 线程 GCD

一 多线程基础 什么是进程?进程是指在系统中正在运行的一个应用程序。 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。 什么是线程?1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)。 1个线程中任务的执行是串行的(执行完上一个才能执行下一个)。 什么是多线程?1个进程中可以开启多条线程,多条线程可以并行(同时)执行不同的任务。 线程可以并行, 但是每个线程中的任务还

IOS开发进阶之路 653

PCL 模型滤波器【2025最新版】

根据给定的模型系数在点云中提取对应于模型的点云数据。博客长期更新,本文最新更新时间为:2025年6月17日。

点云侠的博客 4384

绕过Cloudflare的两种简便方案

绕过Cloudflare的两种简便方案

自成背后的博客 1万+

iOS开发之多线程GCD

GCD全称:(Grand Central Dispatch)是对多线程、多核开发较完整的封装。在使用GCD的时候,系统会自动根据CPU使用情况进行调度,所以GCD是一个简单易用,但是效果很好地多线程多核开发工具。 一、GCD中有2个用来执行任务的函数 1、用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t bloc

柏灿的博客 641

[ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429

[ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429 可以使用一些编码字符来制作URI,以访问WEB-INF目录的内容和/或绕过一些安全限制。默认合规模式允许带有包含 %u002e 段的 URI 的请求访问WEB-INF目录中的受保护资源。

qq_51577576的博客 3208

ios开发之多线程GCD

简介GCD(Grand Central Dispatch)纯C语言编写,提供非常强大的函数,是目前苹果官方网推荐的多线程开发方法,NSOperation便是基于GCD的封装。 GCD的优势1.GCD是苹果公司为多核的并行运算提供了解决方案 2.GCD会自动利用更多的CPU内核(比如:双核、四核) 3.GCD自动管理线程的生命周期(创建线程、跳读任务、销毁线程) 4.程序员只需要告诉GCD想要执行什么

AAJUNWANG的博客 681

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

GCD使用以及多线程开发

对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己。最近刚看完了《Objective-C高级编程 iOS与OS X多线程和内存管理》这本书后,对多线程有了更为深入的理解,故在此做一个总结与记录。这本书是iOS开发者必读的书之一,写得很不错。书的封面如下,故也称狮子书: 。 (1)多线程会遇到的问题 。 多线程会出现什么问题呢

myuantao3286286的博客 601

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

iOS开发之多线程(3)—— GCD

目录版本简介几个概念1. 任务(Task) 和 队列(Queue)2. 同步(sync) 和 异步(async)3. 串行(Serial) 和 并发(Concurrent)4. 主队列(Main Queue) 和 全局队列(Global Queue)GCD的基本使用1. 同步执行 + 串行队列2. 同步执行 + 并发队列3. 异步执行 + 串行队列4. 异步执行 + 并发队列5. 同步执行 + 主队列6. 异步执行 + 主队列死锁 版本 Xcode 11.5 Swift 5.2.2 简介 Grand Cen

看影成痴 531

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IOS开发之多线程与GCD

线程的执行 : 下图明显可以看出,如果不开启多线程的话,程序先走runA方法在走runB,然后再回到runA,再走runC ,A-->B-->C 如果runA在加载网络请求(比如加载图片),这样的话就会阻塞主线程,也就是说先加载完图片在走下面的方法,比如runC是一个点击事件,图片还没加载出来的时候,点击事件是不响应的,这需要什么方法取解决呢?这就得开启多线程了 多线程的执行  开

Jobs 的专栏 438

iOS开发之多线程——NSThread、NSOperation、GCD

一、概述 1、NSThread 优点:轻量级,使用简单; 缺点:需要自己管理线程的生命周期、线程同步,线程同步时对数据加锁会造成系统额外的开销。且难以控制线程的执行顺序和并发数量。 使用方法: ①、类方法:+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)obj,该方法创建线程并

chy305chy的专栏 497

iOS开发多线程篇—GCD介绍

iOS开发多线程篇—GCD介绍 最近正好要用到多线程这部分,就拿来主义mark下。 一、简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数   2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核、

start313的专栏 514

iOS 开发多线程篇—GCD的常见用法

iOS开发多线程篇—GCD的常见用法 一、延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [selfperformSelector:@selector(run)withObject:nilafterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dis...

diyong1866的博客 146

iOS开发——多线程、NSThread、gcd、线程间通信

1.基本概念 1.1 进程 进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。 1.2 线程 (1)基本概念 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程),线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行。 (2)线程的串行 1个线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么...

naziyu的博客 331

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写。  Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。  GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。  AD:2014WO

jinyeweiyang的专栏 438

iOS移动开发多线程—GCD介绍

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

Demon_JiAo的博客 472

iOS 开发之多线程GCD介绍

iOS 开发之多线程GCD介绍!!!

yungeIOS的博客 622
上一篇: iOS图片预览、放大缩小
下一篇: iOS 中 iBeacon 开发
iOS大鑫
博客等级 码龄6年 69粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值