当前位置: 首页 > news >正文

Objective-C语言的多线程编程

Objective-C语言的多线程编程

在现代应用程序开发中,尤其是移动应用开发,多线程编程是一个不可或缺的部分。使用多线程可以提升应用的响应能力,使得可以同时处理多个任务,从而优化用户体验。在本文中,我们将深入探讨Objective-C语言中的多线程编程,包括其基本概念、常用技术、实例分析以及最佳实践。

一、基本概念

1. 什么是多线程?

多线程是一种程序设计技术,允许一个程序同时执行多个线程。每个线程可以被看作是一个独立的执行单位,每个线程都有自己的执行栈和局部变量,但它们共享进程的全局变量和堆内存。

2. 主线程与后台线程

在iOS和macOS中,所有UI操作都应该在主线程(也称为主队列)中进行。当应用程序启动时,系统会创建一个主线程,该线程用于处理所有的用户交互和界面更新。

后台线程则是指在主线程以外的线程,这些线程可以用于执行耗时的任务,如网络请求、数据处理等,从而避免堵塞主线程,确保用户界面的流畅性。

二、Objective-C中的多线程技术

1. NSThread

NSThread是Objective-C中用于创建和管理线程的类。使用NSThread,可以创建新的线程并在其中执行特定的任务。

示例:

```objc @interface MyThread : NSThread @end

@implementation MyThread - (void)main { NSLog(@"Thread is running"); // 在这里执行耗时的操作 } @end

MyThread *myThread = [[MyThread alloc] init]; [myThread start]; ```

在此示例中,我们创建了一个名为MyThread的自定义线程类,并重写了main方法。当我们调用start方法时,线程会开始执行main方法中的代码。

2. Grand Central Dispatch (GCD)

Grand Central Dispatch(GCD)是Apple提供的多线程编程解决方案,能够更简化地管理并发操作。GCD使用队列(queues)来处理任务,使得任务的调度和执行更加高效。

1. 串行队列与并行队列

GCD支持两种类型的队列:串行队列和并行队列。串行队列一次只执行一个任务,而并行队列可以同时执行多个任务。

示例:

```objc // 创建并行队列 dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

// 异步执行任务 dispatch_async(concurrentQueue, ^{ NSLog(@"Task 1 is running"); });

dispatch_async(concurrentQueue, ^{ NSLog(@"Task 2 is running"); }); ```

在此示例中,我们创建了一个并行队列,并在其中异步执行了两个任务。

2. 主队列

主队列是一个特殊的串行队列,用于处理所有与UI相关的更新。我们在主线程中执行的任务会被排入主队列。

示例:

objc dispatch_async(dispatch_get_main_queue(), ^{ // 在主线程中更新UI self.label.text = @"Hello World!"; });

3. NSTimer

虽然NSTimer不直接用于多线程编程,但它也是一个重要的技术,用于定时执行任务。NSTimer可以在主线程或后台线程中工作,通常用于定时更新UI或进行间隔性操作。

示例:

```objc [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];

  • (void)timerFired { NSLog(@"Timer fired"); } ```

4. NSOperation和NSOperationQueue

NSOperation是一个抽象类,表示一个可以在后台执行的操作。NSOperationQueue允许我们将多个操作组合在一起,控制它们的并发执行。

示例:

```objc NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"Operation is running"); }];

[operationQueue addOperation:operation]; ```

三、实例分析

以一个真实的应用场景为例,我们来分析一下如何在iOS应用中使用多线程技术。

1. 下载数据

假设我们需要从网络下载一些数据,并在下载完成后更新用户界面。可以使用GCD来实现这一功能。

```objc dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 在后台线程下载数据 NSURL url = [NSURL URLWithString:@"https://example.com/data"]; NSData data = [NSData dataWithContentsOfURL:url];

// 回到主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{// 解析数据并更新UIself.dataLabel.text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
});

}); ```

在这个例子中,我们首先在全局并行队列中下载数据,随后返回主队列更新UI,确保没有阻塞主线程。

2. 处理大量数据

当需要处理大量数据时,我们可以使用NSOperationQueue来管理这些操作。

```objc NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; operationQueue.maxConcurrentOperationCount = 5; // 最大并发数量

for (NSString *item in dataArray) { [operationQueue addOperationWithBlock:^{ // 处理每个item NSLog(@"Processing %@", item); }]; } ```

在这个场景中,我们可以控制并发的数量,以避免过多的资源占用。

四、最佳实践

在多线程编程中,遵循一些最佳实践可以帮助我们确保代码的健壮性和效率。

1. 避免界面更新阻塞

始终在主线程中进行UI更新,避免在耗时操作中直接修改UI。

2. 使用自动引用计数(ARC)

使用ARC管理内存可以减少多线程中引用循环的问题,确保对象在适当的时机被释放。

3. 管理线程的生命周期

在使用NSThreadNSOperation时,注意管理线程的生命周期,确保线程的正确启动和终止。

4. 确保线程安全

在多个线程共享资源时,确保对共享资源的访问是线程安全的,可以使用锁机制(如@synchronized)或者其他并发控制机制。

5. 使用GCD和NSOperation

应优先选择GCD和NSOperation,因为它们提供了更高层次的抽象,能够更好地隐藏多线程的复杂性。

结论

多线程编程是现代应用程序开发的重要组成部分。在Objective-C中,我们有多种方式来实现并发,如NSThread、GCD、NSOperation等。通过合理的选择和使用这些技术,可以显著提高应用程序的响应速度和性能。掌握多线程编程的技巧,对于提升开发者的能力和解决实际问题具有重要意义。希望本文能为你在Objective-C中的多线程编程提供一些帮助和启发。

相关文章:

Objective-C语言的多线程编程

Objective-C语言的多线程编程 在现代应用程序开发中,尤其是移动应用开发,多线程编程是一个不可或缺的部分。使用多线程可以提升应用的响应能力,使得可以同时处理多个任务,从而优化用户体验。在本文中,我们将深入探讨O…...

Golang的并发编程框架比较

# Golang的并发编程框架比较 中的并发编程 在现代软件开发中,处理高并发的能力愈发重要。Golang作为一门支持并发编程的编程语言,提供了丰富的并发编程框架和工具,使得开发者能够更轻松地处理并发任务。本文将介绍Golang中几种常用的并发编程…...

通过 oh-my-posh posh-git 优化PowerShell

转自oh-my-posh & posh-git 提升在 windows 环境的开发体验 oh-my-posh 是用于自定义 PowerShell 主题和配色的工具,posh-git 则是为 PowerShell 提供了方便的 git 状态显示和命令补全功能。 安装PowerShell 7和 winget下载器,都可以直接在 Microsof…...

【Linux系列】Vim 编辑器中的高效文本编辑技巧:删除操作

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

慧集通(DataLinkX)iPaaS集成平台-连接器

如何创建连接器? 连接器是用于跟各系统进行连接,是集成交互的基础构成也是主要构成之一;连接器一般是根据业务系统的开放的不同方式由开发人员进行封装,封装完成后交付人员可以在所有连接那里建立对应的连接,连接需要…...

vue3使用vue3-video-play播放m3u8视频

1.安装vue3-video-play npm install vue3-video-play --save2.在组件中使用 import vue3-video-play/dist/style.css; import VideoPlay from vue3-video-play;// 视频配置项 const options reactive({src: https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8, //视频源mute…...

单片机-外部中断

中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B,请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的…...

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用,这是一个相当深奥且重要的概念。为了理解右值引用,我们需要先理解左值和右值的概念,然后再理解左值引用和右值引用。本文将详细解析这些概念,并通过实例进行说明,以揭示右值引用如何…...

【HTML+CSS+JS+VUE】web前端教程-1-VScode开发者工具快捷键

VScode打开文件夹与创建文件 1、选择文件夹 2、拖拽文件夹 生成浏览器文件.html的快捷方式 ! 回车vscode常用快捷键列表 代码格式化:shift alt F 向上或向下移动一行: alt up 或者 alt down 快速复制一行代码:shift alt up 或者 sh…...

【嵌入式硬件】直流电机驱动相关

项目场景: 驱动履带车(双直流电机)前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案(这是修改之后的图) 原因分析: 1.主要原因是4路PWM没有限幅,修改…...

接口测试-postman(使用postman测试接口笔记)

一、设置全局变量 1. 点击右上角设置按钮-》打开管理环境窗口-》选择”全局“-》设置变量名称,初始值和当前值设置一样的,放host放拼接的url,key放鉴权那一串字符,然后保存-》去使用全局变量,用{{变量名称}}形式 二、…...

强化学习常用库的版本对应关系

本文介绍了pytorch强化学习框架和常用python库的对应关系。 持续更新中! 基础包 工具包版本描述python3.9.13-numpy1.24.3-protobuf3.19.6结构化数据包cython0.29.21静态编译器setuptools66.0.0-学习框架 工...

Unity 热更新基础知识

文章目录 1.一些名词2.三种编译方式3.Unity 两种脚本后端3.1 Mono3.2 IL2CPP3.3 对比 1.一些名词 IL(Intermediate Language):中间语言(类似于汇编代码)CIL(Common Intermediate Language)&…...

JetBrains IDEs和Visual Studio Code的对比

JetBrains IDEs和Visual Studio Code的对比 JetBrains IDEs是捷克JetBrains公司开发的一系列集成开发环境(IDE)。以下是具体介绍:IntelliJ IDEA是JetBrains 公司的一款产品 主要产品 IntelliJ IDEA:一款功能强大且广泛应用的Java集成开发环境,有开源免费的社区版和商业收…...

C语言将点分十进制的IP字符串转成4个整数

最近在做lldp的snmp返回值时需要做这样的转换处理:C语言将点分十进制的IP字符串转成4个整数。 这里用两种方式: sscanf格式化处理用 inet_aton函数将ip字符串转成32位的整形,然后再根据bit转成对应的4个整数。 man命令可以确认下sscanf和i…...

慧集通(DataLinkX)iPaaS集成平台:数据流程的基本操作

流程搭建与发布 该功能下是我们集成的流程配置实现,在这里我们可以通过搭建一条条不同的流程来实现不同的业务场景。列表界面如下所示: 下面我们做一个业务场景的流程来具体讲解下该功能(OA销售单推送T销售出库单场景)。 首先…...

三线结构光避障远近有度,石头自清洁扫拖机器人G30上市

1月8日,石头科技发布新一代自清洁扫拖机器人产品G30,以卓越的旗舰级性能,为用户带来了更为全面极致的清洁体验。在本届CES2025展会期间,石头G30现身石头科技展台,彰显极致清洁科技。 据「TMT星球」了解,石头…...

深入理解 React 中 setState 的行为及状态更新时机

在 React 开发中,setState 是我们更新组件状态的核心 API。然而,setState 的行为因调用场景的不同而有所变化,这可能会让许多开发者感到困惑。特别是在 React 18 中,引入了自动批量更新机制,使得部分场景的行为发生了变…...

一次完成Win10下MySQL 9.1 的安装

文章目录 前言一、 安装环境二、 安装方式选择三、下载四、安装 总结 前言 一、 安装环境 1、MySQL9.1.0.zip 下载地址:https://dev.mysql.com/downloads/mysql/ 2、Win10 3、客户端MySQL Workbench8.0 CE 下载地址:https://dev.mysql.com/downloads/w…...

有限元分析学习——Anasys Workbanch第一阶段笔记(8)水杯案例的对称与轴对称处理

目录 1 序言 2 对称处理 2.1 模型处理 2.2 网格划分、约束载荷及接触设置 2.3 计算结果 3 轴对称处理 3.1 对称与轴对称概念 3.2 轴对称问题的应用 3.2.1 创建分析案例 3.2.2 导入并处理模型 3.2.3 网格划分、约束载荷及接触设置 3.2.4 后处理计算结果 1 序言 本章…...

Vmware安装centos

用来记录自己安装的过程 一、创建虚拟机安装centos镜像 点击完成后,等待一会会进入centos的系统初始化界面 二、centos初始化配置 三、配置网络 1、虚拟网络编辑器,开启VMnet1、VMnet8的DHCP vmware左上角工具栏,点击【编辑】->【虚拟网…...

[Unity]MacOS下开发Unity

需要的插件 我使用的是vscode,经过长时间的使用我发现一个问题就是很多插件都是动态的在变化的,不是一成不变的,可能是重构,可能直接换了其他的工具。 所以这个插件也会是更新的状态。 2025年01月08日更新 .NET Install Tool …...

快手短剧播放器uniapp如何引入与对接?

uniApp前端微短剧项目开源分享 开源地址:git开源下载地址 文章目录 快手短剧播放器uniapp如何引入与对接?1.引入短剧播放器2.创建文件kscomponents组件3.local-stream.js文件说明4.用户行为事件4.local-stream.ksml文件参考如下 快手短剧播放器uniapp如何…...

Java 数据结构之-LinkedHashMap

继承关系和基本概念 LinkedHashMap是HashMap的子类,它继承了HashMap的基本功能。它在HashMap的基础上,通过维护一个双向链表来记录元素的插入顺序或者访问顺序(可以通过构造函数指定),从而在遍历元素时能够按照特定的顺…...

记一次踩坑:json.Unmarshal() 解析数字类型

首先我们先明确下 json 包下 Unmarshal() 函数是什么: 它是 Go 语言标准库 encoding/json 中的一个函数,用于将 JSON 数据解析为 Go 语言中的数据结构。它的作用是将一个 JSON 格式的字节切片([]byte)转换为对应的 Go 语言数据类…...

leetcode78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1,2],[3],…...

docker学习记录:创建mongodb副本集

目的,是创建三个,避免出现错误时,仍然能正常工作。 要在 Docker 中创建一个 MongoDB 集群(副本集),并确保数据存储在本地,同时允许局域网访问,你可以按照以下步骤进行操作。我们将创…...

JAVA学习-练习试用Java实现“从用户输入获取一个字符串,并使用split方法将其拆分为单词数组,然后打印出所有单词”

问题: 创建一个Java程序,从用户输入获取一个字符串,并使用split方法将其拆分为单词数组,然后打印出所有单词。 解答思路: 以下是一个Java程序,它从用户输入获取一个字符串,并使用 split 方法…...

网络安全 | 数据隐私保护:全球趋势与合规要求

网络安全 | 数据隐私保护:全球趋势与合规要求 一、前言二、全球数据隐私保护的主要趋势2.1 法律法规的强化2.2 消费者意识的觉醒2.3 技术创新推动隐私保护升级 三、不同国家和地区的数据隐私法规3.1 欧盟《通用数据保护条例》(GDPR)3.2 美国《…...

2025年度流行色揭晓:温暖舒适的摩卡慕斯

近日,全球色彩权威机构Pantone公布了2025年度流行色——PANTONE 17-1230 Mocha Mousse (摩卡慕斯)。这是一种温暖的柔和棕色,蕴含着内在的丰富质感,让人联想到可可、巧克力和咖啡的美味质量,满足我们对舒适和简单愉悦的渴望。 Pan…...

el-table拖拽表格

1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js,我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强,实现组件化的思想,可以结合Vue,使用起来更方便。 2、引入拖拽函数…...

Oracle LiveLabs实验: Multitenant Advanced Capabilities

本文为Oracle LiveLabs中实验Multitenant Advanced Capabilities的过程记录。 本实验不提供云上的免费环境,需要利用你自己的OCI账号来创建环境。 实验环境是通过OCI中的Stack,也就是Terraform自动创建的。 Oracle Resource Manager (ORM) stack 文件…...

【大模型】百度千帆大模型对接LangChain使用详解

目录 一、前言 二、LangChain架构与核心组件 2.1 LangChain 核心架构 2.2 LangChain 核心组件 三、环境准备 3.1 前置准备 3.1.1 创建应用并获取apikey 3.1.2 开通付费功能 3.2 获取LangChain文档 3.3 安装LangChain依赖包 四、百度千帆大模型对接 LangChain 4.1 LL…...

Vue3(一)

1.Vue3概述 Vue3的API由Vue2的选项式API改为了组合式API。但是,也是Vue2中的选项式API也是兼容的。 2.创建Vue3项目 create-vue 是 Vue 官方新的脚手架工具,底层切换到了 vite。使用create-vue创建项目的步骤如下: 安装 create-vue npm i…...

php命名空间

什么是命名空间 从广义上来说,命名空间是一种封装事物的方法,在很多地方都可以见到这种抽象概念。 例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。 具体举个例子&#xf…...

AI也会犯错

一、缘起 1.1 问题的发现 AI模型在处理数值比较问题时,出现了一个有趣的现象:当被问到“9.9”和“9.11”哪个更大时,一些AI模型给出了错误的答案,认为“9.9”大于“9.11”。这一问题最初是由 Riley Goodside 发现的,…...

Android NDK开发入门2之适应idm环境

环境搭建 Android NDK开发实战之环境搭建篇(so库,Gemini ai)-CSDN博客 初始配置 前面已经运行了一个简单的初始程序,现在我们来往初始程序添加类和函数,并成功运行的实验。 一级配置 第一层配置主要是cmake文件环境和一些编译选项。 build配置 可参…...

HTML-多媒体标签

除了图像&#xff0c;网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素&#xff0c;用于放置视频。如果浏览器支持加载的视频格式&#xff0c;就会显示一个播放器&#xff0c;否则显示<video>内部的子元素。 <video src"example.…...

[Linux]生产消费者模型

目录 一、生产消费者模型概念 1.概念 2.模块构成 3.协作机制 二、基于BlockingQueue的多CP问题 1.BlockQueue模块 2.Task任务模块 3.创建多线程以及整合模块 三、基于信号量的环形队列CP模型 1.POISX信号量接口 初始化信号量 PV操作 信号量销毁 2.模型简述 3.…...

从零用java实现 小红书 springboot vue uniapp (9)消息推送功能

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们主要完成了个人资料修改 消息页优化 这篇文章我们讲解消息推送 推送页面 因为我们的推送消息都在一个页面 所以我们可以复用消息的websokcet推送 首先需要在 点赞表 收藏表 关注表 回复表 都添加未读字段 MESSAG…...

zookeeper监听机制(Watcher机制)

文章目录 引言I zookeeper监听机制Watcher机制实现分布式的通知功能触发事件种类Watcher的三个过程II watch机制特点一次性触发事件封装event异步发送先注册再触发常见的通知状态和事件类型III 应用案例(Kafka)Kafka的消息模型Kafka在Zookeeper中保存的元数据Kafka 基于Contr…...

企业开通部署 Azure OpenAI 流程:如何创建一个AI聊天机器人

由于众所周知的原因&#xff0c;国内没法直接调用 OpenAI 接口。 下面我将演示企业如何开通 Azure OpenAI 服务&#xff0c;以及如何使用 C# 调用 Azure OpenAI 接口创建一个 Console 应用程序并实现聊天机器人功能。 1开通 Azure OpenAI 服务 要开通 Azure OpenAI 服务&…...

【Linux基础指令】第一期

一、Linux的介绍 Linux是一个开源的操作系统&#xff0c;性能、稳定性、安全性方面上都是很优秀的&#xff0c;所以它一直是企业后端系统的首选。所以其图形化界面并不是Linux的必需品&#xff0c;所以我们避免不了要使用命令行的形式来使用Linux&#xff0c;也就离不开…...

使用 Rust 和 WASM 打造高性能 Web 应用

在现代 Web 开发中&#xff0c;前端性能是衡量用户体验的重要指标之一。随着 WebAssembly (WASM) 的崛起&#xff0c;它为开发者提供了一种在浏览器中运行高性能代码的方式。而 Rust&#xff0c;作为一门以性能和安全性著称的编程语言&#xff0c;与 WASM 的结合使得构建高效的…...

SQL Server中可以通过扩展事件来自动抓取阻塞

在SQL Server中可以通过扩展事件来自动抓取阻塞&#xff0c;以下是详细流程&#xff1a; 开启阻塞跟踪配置&#xff1a; • 执行以下SQL语句来启用相关配置&#xff1a; EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…...

无网络时自动切换备用网络环境

目录 背景目标为什么需要做自动网络切换网络切换手段 网络环境实现思路和代码部署脚本开机自动执行附录连接两个网络时的路由问题 背景 目标 学校实验室有两个网络环境&#xff0c;我电脑使用网线连接稳定但低速的网络A&#xff0c;使用WiFi连接高速但不稳定的网络B。因此&am…...

回顾2024年重磅AI发布汇总

2024年在人工智能领域出现了不少值得关注的发布和进展&#xff0c;以下是根据时间线索&#xff0c;对一些亮点突破进行了总结&#xff1a; 二月 Stability AI 宣布推出Stable Diffusion 3。 Google 升级了 Bard 中的人工智能聊天功能&#xff0c;基于新的Gemini Pro模型&…...

基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址

文章目录 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。代码代码2 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。 代码 #include <iostream> using namespace std;class b…...

Postman接口测试02|接口用例设计

目录 六、接口用例设计 1、接口测试的测试点&#xff08;测试维度&#xff09; 1️⃣功能测试 2️⃣性能测试 3️⃣安全测试 2、设计方法与思路 3、单接口测试用例 4、业务场景测试用例 1️⃣分析测试点 2️⃣添加员工 3️⃣查询员工、修改员工 4️⃣删除员工、查询…...

负载均衡服务器要怎么配置?

目录 一、概述&#xff1a; 二、硬件配置&#xff1a; 三、操作系统配置&#xff1a; 四、负载均衡软件&#xff1a; 五、网络配置&#xff1a; 六、软件安装步骤&#xff1a; 6.1 安装 Nginx 6.2 安装 LVS 6.3 安装 HAProxy 6.4 安装 Keepalived 一、概述&#xff1…...