iOS开发过程中经常遇到的GCD的一些问题

news2024/9/20 7:58:11

目录

前言

1.performSelector相关的一个问题

2.一个崩溃问题


前言

        记录GCD使用过程中遇到的一个小问题。

1.performSelector相关的一个问题

        输入下面代码的打印结果:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self gcdDemos01];
}
- (void)gcdDemos01{
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        NSLog(@"do task1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0];
        NSLog(@"do task3");

    });
}
- (void)test{
    NSLog(@"do task2");
}

        想一下运行之后控制台如何输出:

图1.GCD控制台打印结果

        这里的

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

的底层其实是往Runloop中添加了一个定时器,但是默认情况下子线程中的RunLoop是没有启动的。

        这里如果想要执行test方法,则需要我们手动启动RunLoop。

        修改之后的代码如下:

    [super viewDidLoad];

    [self gcdDemos01];

}

- (void)gcdDemos01{

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_async(queue, ^{

        NSLog(@"do task1");

        [self performSelector:@selector(test) withObject:nil afterDelay:0];

        NSLog(@"do task3");

        [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc]init] forMode:NSDefaultRunLoopMode];

        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

    });

}

- (void)test{

    NSLog(@"do task2");

}

        这个时候运行代码,控制台的打印信息如下:

图2.手动启动RunLoop

        iOS中还有一个类似的方法,就是

- (id)performSelector:(SEL)aSelector withObject:(id)object;

        这个方法底层就是基于Runtime实现的。调用的是msgSend方法。

        我们把上述代码中的方法替换一下,也可以实现test的方法的打印功能。

- (void)viewDidLoad {
    [super viewDidLoad];
    [self gcdDemos01];
}
- (void)gcdDemos01{
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        NSLog(@"do task1");
        [self performSelector:@selector(test) withObject:nil];
        NSLog(@"do task3");
    });
}
- (void)test{
    NSLog(@"do task2");
}

2.一个崩溃问题

        看一下下面代码的打印结果:

- (void)test{
    NSLog(@"do task2");
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSThread * thread = [[NSThread alloc]initWithBlock:^{
        NSLog(@"do task1");
    }];
    [thread start];
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
}

        仔细思考下你想象中的结果。

        控制台打印如下:

图2.控制台输出结果

        这里thread执行完打印任务之后,线程就退出了。退出之后,有在这个线程上执行了test方法,一次崩溃了。

        解决的方案和第一个问题一样,我们手动启动下RunLoop即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语音识别 音码同步声纹分切系统 上海添力

目前主流的语音识别系统&#xff0c;是将语音识别成汉字&#xff0c;会有以下几个问题&#xff1a; 一、一旦识别成汉字&#xff0c;对应语音原有的声音属性都会丢失。在后期的人工智能应用中&#xff0c;仍然需要对识别出的汉字进行人工标注&#xff0c;以区别相同词语的不同情…

【机器学习sklearn实战】线性回归

一 基础概念 广义线性模型&#xff08;2&#xff09;线性回归 【机器学习】一文看尽 Linear Regression 线性回归 二 步骤 使用sklearn中的库&#xff0c;一般使用线性回归器 首先&#xff0c;导入包&#xff1a; from sklearn.linear_model import LinearRegression创建模…

PHP回收废品平台系统小程序源码

&#x1f30d;绿色行动&#xff0c;从“回收废品平台系统”开始&#xff01;&#x1f69a; &#x1f6aa;【家门口的环保站&#xff0c;废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已&#xff0c;不知该如何处理&#xff1f;现在&#xff0c;“…

java-数据结构与算法-02-数据结构-07-优先队列

1. 概念 队列是一种先进先出的结构&#xff0c;但是有些时候&#xff0c;要操作的数据带有优先级&#xff0c;一般出队时&#xff0c;优先级较高的元素先出队&#xff0c;这种数据结构就叫做优先级队列。 比如&#xff1a;你在打音游的时候&#xff0c;你的朋友给你打了个电话…

安全基础学习-CRC理解与计算

由于一些任务要求需要了解CRC校验&#xff0c;于是来学习一下。 新人学习&#xff0c;大佬绕路。 前言 CRC即循环冗余校验码&#xff1a;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&…

《计算机工程与应用》投稿经验

目录 前言期刊简介详细过程第1步&#xff1a;网站投稿第2步&#xff1a;交审稿费第3步&#xff1a;等外审第4步&#xff1a;返修所需材料描述 第5步&#xff1a;外审/复审/录用第6步&#xff1a;录用 前言 记录下投《计算机工程与应用》的正刊投稿经验。 整理了一些投稿期间常…

【C#】 使用GDI+获取两个多边形区域相交、非相交区域

一、使用GDI获取两个多边形区域相交、非相交区域 在 C# 中使用 GDI&#xff08;Graphics Device Interface Plus&#xff09;处理图形时&#xff0c;你可以使用 System.Drawing 和 System.Drawing.Drawing2D 命名空间中的类来操作区域&#xff08;Region&#xff09;。下面是一…

取图小程序搭建教程,达人+流量主+会员快速部署上线指南

目录 一、取图小程序是什么&#xff1f; 二、搭建教程 &#xff08;一&#xff09;前期准备 &#xff08;二&#xff09;开发环境搭建 &#xff08;三&#xff09;部署与上线 三、部分代码展示 一、取图小程序是什么&#xff1f; 取图小程序以其多元化的功能而著称&…

抖音本地生活城市代理保证金多少?最新标准出炉!

随着本地生活的前景和潜力不断显现&#xff0c;抖音本地生活城市代理的申请热度不断攀升&#xff0c;并逐渐成为众多创业者入局本地生活的首要选择&#xff0c;而与之相关的问题&#xff0c;如抖音本地生活城市代理保证金等更是长居相关社群话题榜的前列。 而就目前的市场情况来…

2024华为数通HCIP-datacom最新题库(H12-831变题更新⑧)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

抖音开放平台API接口如何开发||抖音相关接口数据采集数据分析 【附实例】

抖音开放平台提供了多种接口&#xff0c;包括授权登录、用户信息、视频管理、评论互动、消息通知、数据分析等。 以下是开发抖音接口的一些步骤&#xff1a; 1. 注册开发者账号&#xff1a;在抖音开放平台上注册开发者账号&#xff0c;获取开发者身份认证。 2. 创建应用&…

学习鸿蒙-利用Code Linter检查代码

如何检查&#xff1a; 1.在已打开的代码编辑器窗口单击右键点击Code Linter&#xff0c;或在工程管理窗口中鼠标选中单个或多个工程文件/目录&#xff0c;右键选择Code Linter > Full Linter执行代码全量检查。 2.通过git 提交&#xff0c;可在commit界面右下角点击齿轮图标…

嵌入式开发问题总汇

1. 事情经过&#xff1a;有天快下班的时候&#xff0c;我们采购经理找到我&#xff0c;说&#xff0c;生成的bin文件通过软件上传烧录时&#xff0c;烧录就会重启&#xff0c;但是其他的板子就不会。最后他换了一个A厂家的flash芯片&#xff0c;就可以了。但是&#xff0c;B厂…

使用 Postman 进行 Trello API 自动化测试的完整指南

文章目录 前言一、自动化测试是什么&#xff1f;二、比较自动化测试与手工测试1. 自动化测试2. 手工测试 三、环境搭建1.创建Collection2.创建环境变量3.添加API请求 四、设计测试用例1. API简单调用2. 获取所有emoji3. 创建一个新看板&#xff1a;4. 获得创建的看板信息5. 在看…

【Git】git 从入门到实战系列(一)—— Git 的诞生,Linus 如何在 14 天内编写出 Git?

<> 博客简介&#xff1a;Linux、rtos系统&#xff0c;arm、stm32等芯片&#xff0c;嵌入式高级工程师、面试官、架构师&#xff0c;日常技术干货、个人总结、职场经验分享   <> 公众号&#xff1a;嵌入式技术部落   <> 系列专栏&#xff1a;C/C、Linux、rt…

【机器学习】决策边界的基本概念以及如何在逻辑回归中找到决策边界

引言 在机器学习中&#xff0c;决策边界是分类算法用来区分不同类别数据点的线、面或超平面。这些边界通常是模型的预测规则&#xff0c;用于将特征空间中的点分配到不同的类别。决策边界可以是线性的&#xff0c;也可以是非线性的&#xff0c;取决于数据的分布和所使用的分类算…

探索开明软件包:应用开发指南轻松掌握,快速上手!

开明软件包格式&#xff0c;是openKylin社区Kaiming SIG为应对传统包格式存在的系统与应用无明确界限、发行版碎片化、兼容性等问题而开发的一款全新软件包格式&#xff0c;满足ISV&#xff08;Independent Software Vendors&#xff09;应用发布和应用独立发布需求&#xff0…

AI绘画:PS+comfyUI 工作流,直接在PS搞AI!

前言 直接在PS搞AI要不要&#xff1f; 大神 Nima Nazari 发布了一个可以无缝链接PS和comfyUI的工作流。 小编对该工作流进行了一个安装使用的测评&#xff0c;该工作流可以无缝与PS进行互联操作&#xff0c;切换模型和修改参数时还是需要在PS和ComfyUI间切换。总体而言&#x…

CSCP、CPIM和CLMP三大证书的区别?如何选择?

在制造型企业、供应链和运营管理专业人士都会不断寻找方法来提升他们的技能和职业前景。三种流行的认证——CSCP&#xff08;Certified Supply Chain Professional&#xff09;、CPIM&#xff08;Certified in Planning and Inventory Management&#xff09;以及CLMP&#xff…

其他:trycatch模块捕获循环错误,避免中断程序

介绍 今天有位同事问我怎么在某次循环报错后仍然可以继续程序运行&#xff0c;最后我们使用了trycatch模块。 代码解读 任务&#xff1a;在循环中&#xff0c;如果某次循环的calc出现错误则跳过这次循环并重新赋值结果 res_list <- list() # 创建一个空列表来存储结果fo…