一、什么是 GCD
1. GCD 是苹果为解决多线程而定义的一套库,并且 GCD 可以自动管理线程的生命周期,就可 ARC 类似,不需要我们手动去管理
2. GCD 是用 纯C 语言 写的,所以我门使用的是 GCD 中的函数,并不是面向对象的方法
3. GCD 核心概念
1)任务 : 就是某个线程要执行的方法
2)队列 : 存放所有的任务
4. GCD 使用步骤
1)确定要执行的任务
2)将任务添加到队列中,GCD 会自动将队列中的任务取出,放在对应的线程中去执行
5. 同步异步
1)同步 : 在同一个线程中执行任务,不会创建新的线程
// 同步函数
// 参数 1: 队列
// 参数 2: 任务的代码块
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
复制代码
2)异步 : 创建一个新的线程,并在新的线程中执行任务
// 异步函数
// 参数 1: 队列
// 参数 2: 任务的代码块
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
复制代码
6. 队列队列可分为两种
1)异步队列 : 即并行执行的队列,队列中的每个任务都可以并发(同步)执行
2)串行队列 : 即串行执行的队列,队列中的每个任务需要串行执行,即一个一个来
获得队列
// 创建串行队列
// 参数 1: 队列名称,C风格字符串
// 参数 2: 队列的属性,一般用 NULL 即可
dispatch_queue_t dispatch_queue_create(const char *_Nullable label, dispatch_queue_attr_t _Nullable attr);
复制代码
dispatch_queue_t 是队列的类型
// 获得主队列,主队列是一个串行队列,并且与主线程对应,主队列中的任务都会被主线程执行
dispatch_queue_t dispatch_get_main_queue(void);
复制代码
// 全局并发队列,可以供整个应用使用,不需手动创建
// 参数 1: 队列的优先级(有4个)
// #define DISPATCH_QUEUE_PRIORITY_HIGH 2 高优先级
// #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认
// #define DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级
// 参数 2: 队列的属性,可以穿 0
dispatch_queue_t dispatch_get_global_queue(long identifier, unsigned long flags);
复制代码
二、GCD 基础应用
1. 异步/同步函数 与 串行/并行队列
1)使用异步函数向并发队列中添加任务
// 1. 打印主线程
NSLog(@"主线程 --- %@", [NSThread currentThread]);
// 2. 获取全局并发队列,并设置优先级为默认
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 3. 添加任务到并行队列中,就可以执行任务了
// 使用异步函数添加任务,可以开启新的线程
dispatch_async(queue, ^{
NSLog(@"任务 1 --- %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务 2 --- %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务 3 --- %@", [NSThread currentThread]);
});
复制代码
运行结果
333.png
总结 : 可以看出,除了主线程之外,还分别创建了三个子线程,并且三个子线程是并发执行的
2)使用异步函数向串行队列中添加任务
// 1. 创建串行队列
// 参数 1: 串行队列的名称,是 C风格字符串
// 参数 2: 串行队列的属性,一般来说串行队列是不需要任何属性,可以传 NULL
dispatch_queue_t queue = dispatch_queue_create("Chuanxin", NULL);
NSLog(@"主线程 --- %@", [NSThread currentThread]);
// 2. 使用异步函数往串行队列中添加任务
dispatch_async(queue, ^{
NSLog(@"任务 1 --- %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务 2 --- %@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务 3 --- %@", [NSThread currentThread]);
});
复制代码
运行结果
4444.png
总结 : 使用异步函数向串行队列中添加任务时,会开启新的线程,但是只会开启一个;因为串行队列中的任务需要一个一个执行,不必同时执行,所以只会创建一个新新线程
3)使用同步函数向并行队列中添加任务
NSLog(@"主线程 --- %@", [NSThread currentThread]);
// 1. 获取全局的并行队列,并设置优先级为 默认
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2. 使用同步函数往并行队列中添加任务
dispatch_sync(queue, ^{
NSLog(@"任务1 --- %@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2 --- %@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务3 --- %@", [NSThread currentThread]);
});
复制代码
运行结果
555.png
555.png (44.47 KB, 下载次数: 0)
下载附件
5 秒前 上传
总结 : 因为使用的是同步函数,所以不会创建新的线程,所以都是在主线程中执行;此时,并发队列就失去了其功能,因为都没有新的线程创建,何谈并发
原文链接:http://bbs.jointforce.com/topic/26514
分享到:
相关推荐
"IOS应用源码——多线程.zip"这个压缩包很可能包含了一个示例项目,演示了如何在iOS应用中实现多线程技术。我们来详细探讨一下iOS应用中的多线程技术及其相关知识点。 1. **主线程与UI更新**:iOS应用的用户界面...
"IOS实例开发源码——多线程编程.zip"这个压缩包提供了一些关于iOS多线程编程的实际案例,特别关注了GCD(Grand Central Dispatch)这一现代多线程管理工具。 1. **GCD简介** GCD是Apple为解决多核处理器环境下的...
在iOS开发中,实现多线程的的方式有很多种,常用的有pthread、NSThread、GCD与NSOperation。在实际应用中,多线程技术也有着非常多的使用场景,比如异步的网络请求、异步的图片加载、后台执行复杂任务等等。 在iOS...
了解和掌握多线程原理以及相关的工具和技术(如`NSThread`、`NSOperationQueue`和GCD等)对于构建高质量的iOS应用至关重要。同时,需要注意的是,虽然多线程可以提高程序的性能,但是过度的线程使用可能会导致资源...
在iOS应用开发中,多线程技术是必不可少的,它能帮助我们实现UI的流畅更新,后台任务的异步执行,提高应用的响应速度。这个名为"NSThread.zip"的压缩包提供了一个简单的iOS应用源码示例,专门用于演示如何在iOS中...
Grand Central Dispatch(GCD)是苹果公司开发的一个强大的多线程编程解决方案,它的设计目的是为了简化多线程编程模型,使得开发者可以更高效地利用多核处理器的性能。GCD通过提供一套简洁的API,隐藏了线程管理的...
【iOS应用源码——ThreadDemo】是一个用于学习和理解iOS多线程技术的示例项目。这个源码库,ThreadDemo,旨在帮助开发者深入理解如何在iOS应用中有效地使用线程,尤其是苹果的GCD(Grand Central Dispatch)和...
这两份指南——《iOS并发编程指南》和《多线程编程指南》将深入讲解以上知识点,并通过实例帮助开发者更好地理解和运用到实际项目中。通过学习,开发者能够熟练掌握iOS平台上的并发编程技巧,提升应用的性能和用户...
"IOS应用源码——Threading.rar"这个压缩包很可能是提供了一些关于iOS线程管理的示例代码,帮助开发者理解和实践多线程编程。 在iOS中,主要有三种线程模型:Main Thread(主线程)、NSOperationQueue(操作队列)...
在iOS开发中,多线程的实现方式主要有三种,NSThread、NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用。案例代码上传至 ...
Grand Central Dispatch (GCD)和Operation Queues是苹果推荐的多线程解决方案。理解它们的工作原理和使用方法,能够优化性能并避免常见的并发问题。 6. **网络编程**:iOS应用常常需要与服务器进行数据交换。...
源码中可能会涉及到GCD(Grand Central Dispatch)、OperationQueue或NSOperation等多线程技术。理解并掌握这些技术,可以有效提高应用性能和响应速度。 7. **框架与库的使用** "Pegasus for iOS"可能引入了其他第...
开发者需要掌握GCD(Grand Central Dispatch)或NSOperationQueue等多线程技术,以确保音频播放的流畅性。 5. **AVFoundation框架集成**: 虽然oalTouch主要依赖OpenAL,但为了实现更丰富的音频功能,开发者可能会...
7. **GCD (Grand Central Dispatch)**:在iOS开发中,GCD用于处理多线程任务,例如在后台线程加载图片,然后在主线程更新UI。 8. **Swift编程语言**:此源码应该是使用Swift编写的,了解Swift的基本语法、面向协议...
在iOS开发中,Grand Central Dispatch(GCD)是苹果提供的一种多线程处理技术,用于优化应用程序的性能。GCD是基于C语言的,但在Swift中可以无缝集成,因此我们可以通过Swift来理解和应用GCD。本篇文章将深入探讨...
对于多线程处理,iOS提供了GCD(Grand Central Dispatch)和Operation/Queue系统。如果"PuffPuff"需要执行耗时操作,源码中可能会有异步任务的处理,比如使用GCD的队列或NSOperation来保证主线程的流畅性。 此外,...
为了保证用户界面的流畅性,检测静音模式的操作可能会在后台线程进行,这涉及到多线程编程和 gcd(Grand Central Dispatch)或NSOperationQueue的使用。 7. **KVO(Key-Value Observing)**: 开发者可能使用了...
7. **多线程**:为了确保用户体验,网络请求和数据处理通常会在后台线程进行。我们可以检查GCD(Grand Central Dispatch)或OperationQueue的使用。 8. **授权认证**:如果应用需要用户登录Flickr账户,那么可能...