`
郭丶小川
  • 浏览: 33994 次
社区版块
存档分类
最新评论

iOS —— 多线程GCD

    博客分类:
  • IOS
阅读更多
一、什么是 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应用源码——多线程.zip"这个压缩包很可能包含了一个示例项目,演示了如何在iOS应用中实现多线程技术。我们来详细探讨一下iOS应用中的多线程技术及其相关知识点。 1. **主线程与UI更新**:iOS应用的用户界面...

    IOS实例开发源码——多线程编程.zip

    "IOS实例开发源码——多线程编程.zip"这个压缩包提供了一些关于iOS多线程编程的实际案例,特别关注了GCD(Grand Central Dispatch)这一现代多线程管理工具。 1. **GCD简介** GCD是Apple为解决多核处理器环境下的...

    iOS高级程序员进阶——多线程编程核心技术模式篇

    在iOS开发中,实现多线程的的方式有很多种,常用的有pthread、NSThread、GCD与NSOperation。在实际应用中,多线程技术也有着非常多的使用场景,比如异步的网络请求、异步的图片加载、后台执行复杂任务等等。 在iOS...

    iOS中多线程原理与runloop介绍

    了解和掌握多线程原理以及相关的工具和技术(如`NSThread`、`NSOperationQueue`和GCD等)对于构建高质量的iOS应用至关重要。同时,需要注意的是,虽然多线程可以提高程序的性能,但是过度的线程使用可能会导致资源...

    IOS应用源码——ui多线程的简单例子 NSThread.zip

    在iOS应用开发中,多线程技术是必不可少的,它能帮助我们实现UI的流畅更新,后台任务的异步执行,提高应用的响应速度。这个名为"NSThread.zip"的压缩包提供了一个简单的iOS应用源码示例,专门用于演示如何在iOS中...

    IOS 多线程GCD详解

    Grand Central Dispatch(GCD)是苹果公司开发的一个强大的多线程编程解决方案,它的设计目的是为了简化多线程编程模型,使得开发者可以更高效地利用多核处理器的性能。GCD通过提供一套简洁的API,隐藏了线程管理的...

    IOS应用源码——ThreadDemo.rar

    【iOS应用源码——ThreadDemo】是一个用于学习和理解iOS多线程技术的示例项目。这个源码库,ThreadDemo,旨在帮助开发者深入理解如何在iOS应用中有效地使用线程,尤其是苹果的GCD(Grand Central Dispatch)和...

    iOS并发编程指南与多线程编程指南合集

    这两份指南——《iOS并发编程指南》和《多线程编程指南》将深入讲解以上知识点,并通过实例帮助开发者更好地理解和运用到实际项目中。通过学习,开发者能够熟练掌握iOS平台上的并发编程技巧,提升应用的性能和用户...

    IOS应用源码——Threading.rar

    "IOS应用源码——Threading.rar"这个压缩包很可能是提供了一些关于iOS线程管理的示例代码,帮助开发者理解和实践多线程编程。 在iOS中,主要有三种线程模型:Main Thread(主线程)、NSOperationQueue(操作队列)...

    iOS多线程开发——NSThread浅析

    在iOS开发中,多线程的实现方式主要有三种,NSThread、NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用。案例代码上传至 ...

    《iOS组件与框架——iOS SDK高级特性剖析》源码

    Grand Central Dispatch (GCD)和Operation Queues是苹果推荐的多线程解决方案。理解它们的工作原理和使用方法,能够优化性能并避免常见的并发问题。 6. **网络编程**:iOS应用常常需要与服务器进行数据交换。...

    IOS应用源码——Pegasus for iOS.rar

    源码中可能会涉及到GCD(Grand Central Dispatch)、OperationQueue或NSOperation等多线程技术。理解并掌握这些技术,可以有效提高应用性能和响应速度。 7. **框架与库的使用** "Pegasus for iOS"可能引入了其他第...

    IOS应用源码——oalTouch.zip

    开发者需要掌握GCD(Grand Central Dispatch)或NSOperationQueue等多线程技术,以确保音频播放的流畅性。 5. **AVFoundation框架集成**: 虽然oalTouch主要依赖OpenAL,但为了实现更丰富的音频功能,开发者可能会...

    IOS应用源码——相册.rar

    7. **GCD (Grand Central Dispatch)**:在iOS开发中,GCD用于处理多线程任务,例如在后台线程加载图片,然后在主线程更新UI。 8. **Swift编程语言**:此源码应该是使用Swift编写的,了解Swift的基本语法、面向协议...

    iOS开发GCD编程

    在iOS开发中,Grand Central Dispatch(GCD)是苹果提供的一种多线程处理技术,用于优化应用程序的性能。GCD是基于C语言的,但在Swift中可以无缝集成,因此我们可以通过Swift来理解和应用GCD。本篇文章将深入探讨...

    IOS应用源码——PuffPuff.rar

    对于多线程处理,iOS提供了GCD(Grand Central Dispatch)和Operation/Queue系统。如果"PuffPuff"需要执行耗时操作,源码中可能会有异步任务的处理,比如使用GCD的队列或NSOperation来保证主线程的流畅性。 此外,...

    IOS应用源码——VSSilentSwitch for iOS.rar

    为了保证用户界面的流畅性,检测静音模式的操作可能会在后台线程进行,这涉及到多线程编程和 gcd(Grand Central Dispatch)或NSOperationQueue的使用。 7. **KVO(Key-Value Observing)**: 开发者可能使用了...

    IOS应用源码——一些iPhone开源项目代码iflickr.zip

    7. **多线程**:为了确保用户体验,网络请求和数据处理通常会在后台线程进行。我们可以检查GCD(Grand Central Dispatch)或OperationQueue的使用。 8. **授权认证**:如果应用需要用户登录Flickr账户,那么可能...

Global site tag (gtag.js) - Google Analytics