iOS经典讲解之多线程GCD的应用

iOS开发之多线程 iOS开发之多线程本文章博主和大家一块学习多线程,很自然就涉及到线程和进程,然后涵括NSThread、GCD、NSOperation!然后就是最牛叉的RunLoop和Runtime。一、线程与进程进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,每个进程之间是相互独立的。一个进程要想执行任务,必须要有线程,至少有一条线程,一个进程的所有任务都是在线程中执行。其实应用程序启动的时候我么你 阅读详情


@implementation RootViewController


- (void)viewDidLoad {
    [super viewDidLoad];
   // [self serialQueue];
   // [self concurrentQueue];
      [self gameStar];
   
}

#pragma mark ----------------创建串行队列两种方式--------------------
// 创建串行队列
- (void)serialQueue
{
    // 串行队列分两种
    //1、主线程的串行队列(主串队列)
    // dispatch_queue_t GCD中表示一个队列
    // 创建一个主队列 实际上就是把主线程取出来
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 添加任务1
    // 参数一 要添加任务的队列
    // 参数二 要执行的任务
    dispatch_async(mainQueue, ^{
        
        NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    // 添加任务2
    dispatch_async(mainQueue, ^{
        
         NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    // 添加任务3
    dispatch_async(mainQueue, ^{
         NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    
    
    // 2、自定义的串行队列
    //创建一个自定义的线程队列
    // 参数1 队列的标示符 (C语言字符串)
    // 参数2 队列的执行类型(串/并)
    //DISPATCH_QUEUE_SERIAL 串行
    dispatch_queue_t myQueue = dispatch_queue_create("com.lxl", DISPATCH_QUEUE_SERIAL);
    // 添加任务1
    dispatch_async(myQueue, ^{
        
        NSLog(@"--第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    
    // 添加任务2
    dispatch_async(myQueue, ^{
        
        NSLog(@"--第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    // 添加任务3
    dispatch_async(myQueue, ^{
        NSLog(@"--第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    
    //延迟回到主线程执行
    //<#delayInSeconds#>填延迟几秒执行
    // 延迟几秒后回到主线程执行任务
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        
        NSLog(@"延迟5秒执行");
         NSLog(@"延迟任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });
    
    // 延迟执行
    // 参数2 <#dispatch_queue_t queue#> 自定义队列
    // C语言中 ull 是字面量 表示unsigned long long
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6ull), myQueue, ^{
       
        NSLog(@"延迟6秒执行");
         NSLog(@"延迟任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
    });

    
}
#pragma mark -------------------创建并行队列两种方式------------------------
// 创建并行队列
- (void)concurrentQueue
{
    
    // 创建一个队列
    // 参数1 队列的执行顺序 默认的
    // 参数2 预留参数 一般填0
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 添加任务1
    dispatch_async(queue, ^{
        
        for (int i = 0; i < 10; i++) {
            
            NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        }
    });
    // 添加任务2
    dispatch_async(queue, ^{
        
        for (int i = 0; i < 10; i++) {
            
            NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        }
    });
    // 添加任务3
    dispatch_async(queue, ^{
        
        for (int i = 0; i < 10; i++) {
            
            NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        }
    });
    
    
    // 自定义并行队列
    // 参数1 队列标识符
    // 参数2 执行顺序(串/ 并) DISPATCH_QUEUE_CONCURRENT并行队列
    dispatch_queue_t myQueue = dispatch_queue_create("com.www", DISPATCH_QUEUE_CONCURRENT);
    // 添加任务1
    dispatch_async(myQueue, ^{
        
        
        for (int i = 0; i < 10; i++) {
            
            NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        }
    });
    // 添加任务2
    dispatch_async(myQueue, ^{
        
        for (int i = 0; i < 10; i++) {
            
            NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        }

    });
    // 添加任务3
    dispatch_async(myQueue, ^{
        
        
        for (int i = 0; i < 10; i++) {
            
            NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        }
    });
}

#pragma mark -------------模拟游戏开始的线程操作--添加屏障------------------------
// 模拟游戏开始的线程操作
- (void)gameStar
{
    // 需求 一共四玩家一起进入游戏 当所有人都进入游戏的时候 开始读取数据
    // 思路:
    //1、选取什么队列 并行
    //2、如何实现特殊要求 把并行队列用屏障隔开
    //屏障的作用:把队列分成上下部 分开执行
    
    // 创建一个并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.game", DISPATCH_QUEUE_CONCURRENT);
    // 添加任务1
    dispatch_async(queue, ^{
        
        NSLog(@"玩家一进入游戏");
        
    });
    // 添加任务2
    dispatch_async(queue, ^{
        
        NSLog(@"玩家二进入游戏");
        
    });
    // 添加任务3
    dispatch_async(queue, ^{
        
        NSLog(@"玩家三进入游戏");
        
    });
    
    // 设置屏障
    dispatch_barrier_async(queue, ^{
    NSLog(@"等待其他玩家进入...");
    });
    
   // 添加读取信息任务
    // 玩家一读取完成
    dispatch_async(queue, ^{
        NSLog(@"玩家一读取信息");
    });
    // 玩家二读取完成
    dispatch_async(queue, ^{
        NSLog(@"玩家二读取信息");
    });
    // 玩家三读取完成
    dispatch_async(queue, ^{
        NSLog(@"玩家三读取信息");
    });
    // 主线程进入游戏
    // 再加一个屏障 进入主线程刷新界面
    dispatch_barrier_async(queue, ^{
        
        // 回到主线程 相当于给主线程添加一个任务
        dispatch_async(dispatch_get_main_queue(), ^{
            
            NSLog(@"回到主线程 刷新界面 开始界面");
            
        });
    });
    
}

【iOS】—— 深入了解GCD 百度:Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。苹果官方:Grand Central Dispatch(GCD) 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级实现。... 阅读详情

相关推荐

深入掌握iOS GCD多线程编程

本文还有配套的精品资源,点击获取 简介:GCD(Grand Central Dispatch)是iOS多线程编程的高效工具,简化了并发编程的复杂性,提供了灵活的异步执行机制。本教程详细介绍了GCD的基本概念、队列类型、任务提交方式以及工作模式,并通过示例讲解了如何创建队列、提交任务、延迟执行、实现栅栏任务以及使用小组件来跟踪任务。同时,提供了GCD最佳实践建议,如避免主线程...

weixin_42601608的博客 1008

iOS中的多线程开发技术第四篇之IO操作

在 iOS 开发中,数据访问的多线程环境非常普遍,例如缓存系统、数据库查询、文件操作等。对于多读少写的场景,设计一个高效且线程安全的方案至关重要。本文将深入介绍多读少写的设计思想,并结合实际代码示例进行详细讲解。

我叫柱子哥 1407

深入理解iOS GCD多线程开发

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

weixin_30481539的博客 1014

iOS GCD的一些用法

iOS GCD的一些用法 多线程GCD是纯C的API, 使用起来更高效 本文主要讲了 1 GCD异步操作 2 GCD经典死锁 3 GCD线程组 4 GCD信号量 1 异步并发 - (void)diapatchAsyncWithConcurrent { dispatch_queue_t queue = dispatch_queue_create("com.nyl", DISPATCH_QUE...

风起云涌的博客 328

基于Playwright的雪球网股票情绪数据自动化采集实战

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理在于模拟浏览器行为或直接发送HTTP请求以解析网页内容。在金融科技与量化分析领域,实时、稳定的数据源具有极高的技术价值,能够为市场情绪分析、因子挖掘提供基础。面对采用动态加载、复杂反爬机制的现代单页应用,传统的请求库与Selenium方案在稳定性与隐蔽性上面临挑战。本文聚焦于利用Playwright这一现代浏览器自动化工具,通过模拟真实用户交互、监听网络请求,构建一个能够稳定采集雪球社区实时讨论热度的解决方案。该方案不仅解决了动态内容渲染问题,还通过请

weixin_42529328的博客 585

什么是PCIe Relaxed Ordering

什么是PCIe上的Relaxed Ordering呢?直接翻译的话就是宽松排序。在理解这个东西之前,需要先了解下什么是PCIe的基本事务排序法则。

qq_42824983的博客 1511

一文看懂iOS多线程并发(NSThread、GCD、NSOperation&&NSOperationQueue)

一万一千字带你进入iOS多线程并发的世界!

ScheenDuan的博客 2448

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

[iOS]GCD(一)

[iOS]GCD(一)

m0_74703932的博客 2158

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

成本150元的高性能RDP协议瘦客户机

云终端市场是一个跨度很大的市场。既有数千元的品牌的瘦客户机,也有几百元的瘦客户机,还有200-300元的支持RDP协议的多用户云终端。但是200-300元的多用户终端,在显示性能上不尽人意,一般用于地产中介门店,工厂产线的电子看板等场合。有没有性能更好,价格更低的方案呢? 答案是有。 这个方案就是 二手的x86 瘦客户机 + DoraOS瘦客户机系统免费版(仅支持RDP)。 首先我们看硬件,在某宝搜索 升腾C92 ,找到最低配置的( CPU:J1800,内存:2G,硬盘:8G)。价格都在150以内。

云飞扬的桌面云 7412

iOS—GCD详解

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

qq_45836906的博客 6625

基于全局和局部接受性因果特征的广义学习模型,用于在线增量机械故障诊断

本文提出了一种**因果广义学习模型(CBLM)**,用于在线增量机械故障诊断。该模型结合了**全局因果特征**(时域、频域、故障特征频率均值)和**多尺度局部因果特征**(通过扩张卷积提取),构建了一个具有**增量学习能力**的广泛学习系统(BLS)。CBLM支持**结构增量学习**(增加增强节点)和**样本增量学习**(动态更新权重),无需重新训练整个模型,显著提高了计算效率和诊断精度。在两个滚动轴承数据集上的实验表明,CBLM在诊断准确性和训练时间上均优于传统深度学习模型,适用于在线实时故障诊断。

huanghm88的专栏 387

iOS多线程编程及GCD简介

程序APP进程、线程、多线程 1.程序是计算机(电脑,智能手机,机器人等有操作系统的智能新生物)指令的集合,以文件形式存储在磁盘上。 2.进程是一个正在运行的程序实例,是一个程序在其自身的地址空间中的一次执行活动。 3.进程由内核对象和地址空间组成。 4.线程由内核对象和线程栈组成,它是进程运行过程中的某个时间片,多核CUP时,线程就实现了同时运行。 iOS提供四种多线程编程技术 ...

zhuxincheng_1218的专栏 1007

SAP_SD模块路径及运输功能后台配置简介

后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义传输模式根据实际运输过程运输地理的类型:海运、公路运输、空运后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义发运类型根据实际运输过程运输方式:汽车、卡车、火车、轮船、飞机后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义运输连接点指在运输过程中需要中转的地区可以维护中转地区的停留的时间后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义路径和阶段。

我小时候很黑的博客 1399

iOS多线程技术3 - GCD的详细用法

多线程的相关概念 工欲善其事,必先利其器,在进入 GCD 学习之前,我们有必要先了解一下多线程的一些概念。 进程:进程是程序在计算机上的一次执行活动。例如打开一个 app,就开启了一个进程,一个进程可以并发多个线程。 线程:线程就是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个线程同一时间只能执行一个任务,平时我们所说的多任务并发实际上是多个线程并发去...

毛毛虫 1859

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【iOS】GCD学习

本博客撰写一下小蓝书的GCDGrand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。//让处理在后台线程中执行/**长时间处理*例如AR用画像识别*例如数据库访问*//*

weixin_72437555的博客 1314

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【IOS】GCD学习

笔者近期学习了GCD的使用,对于GCD的认识更加深刻,本篇博客对笔者的学习进行一个小小的总结

2301_79847748的博客 1449

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

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

【iOS】多线程与GCD

进程与线程之间的关系主要涉及两个方面:新建 - 就绪 - 运行 - 阻塞 - 死亡 线程与进程 线程和进程的定义 线程多线程的生命周期 新建 - 就绪 - 运行 - 阻塞 - 死亡 简要说明,就是处于运行中的线程拥有一段可以执行的时间(称为时间片),线程的exit与cancel说明:线程的优先级越高,是不是意味着任务的执行越快? 线程自信的快慢,除了要看优先级,还要查看资源的大小(即任务的复杂程度)、以及CPU调度情况。在NSThread中,线程优先级threadPriority已经被服务质量quality

2402_86720949的博客 1148

iOS多线程——RunLoop与GCD、AutoreleasePool

你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里转载请注明出处 http://www.jianshu.com/p/f0a7fb39f79c本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不

什么都不会的小菜鸟 2476

iOS多线程之GCD

多线程编程是iOS 开发中必不可少的部分。这一篇博客主要是讲一讲GCD相关的知识。

LilyNothing的博客 502

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

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

IOS开发进阶之路 653

iOS 多线程之 GCD 的介绍

GCD 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用代码在系统级中实现。开发者可以定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD 就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样,就比以前的线程更有效率。GCD是纯 C语言,并且它的大多数函数是以 dispatch 开始的。

满脸胡茬的小码农 600

iOS 多线程开发之OperationQueue(二)NSOperation VS GCD

原创Blog,转载请注明出处 blog.youkuaiyun.com/hello_hwc欢迎关注我的iOS SDK详解专栏 http://blog.youkuaiyun.com/column/details/huangwenchen-ios-sdk.html前言:最近有点忙,所以这个月更新的博客数量有些下降,估计这个月和下个月博客更新的数量都在10篇左右。回到正题,本文会比较下GCD和NSOperation两种多线程的

Leo的专栏 3927
上一篇: iOS经典讲解之多线程应用场景
下一篇: iOS经典讲解之线程锁NSLock案例(卖火车票)
刘新林
博客等级 码龄11年 72粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值