iOS 中的多线程总结

iOS面试题:多线程在iOS开发中的应用 概述重点: NSThread 多线程基础、pthread、开启线程的3种方式 线程的状态、线程安全问题、线程间的通信GCD 同步方法和异步方法、队列的使用、线程间的通信 延迟执行、一次性代码、队列组、单例模式-ARC、单例模式-MRC、用宏抽取单例模式NSOperation NSOperation和NSOperationQueue的概念理解、NSInvocationOperation、NSB 阅读详情

iOS中有4中多线程操作方式,分别是:NSObject多线程技术 、NSThread的多线程技术 、 NSOperation,面向对象的多线程技术 、 GCD,C语言实现的多线程技术。接下分别总结这几种方式的用法

一、  NSObject多线程技术

因为iOS中的所有类都是NSObjcet的子类,所以任何类都能够进行如下操作:

 1> 使用performSelectorInBackground可以开启后台线程,执行selector选择器选择的方法

 2> 使用performSelectorOnMainThread可以重新回到主线程执行任务,通常用于后台线程更新界面UI时使用

 3> [NSThread sleepForTimeInterval:1.0f];

    让当前线程休眠,通常在程序开发中,用于模拟耗时操作,以便跟踪不同的并发执行情况!

 

 提示:使用performSelectorInBackground也可以直接修改UI,但是一定要在主线程中修改UI。

 

 注意:在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池,否则容易出现内存泄露。


实例代码:

UITextField *field = [[UITextField alloc] init];
    field.text = @"Programing is fun";
    NSLog(@"执行前:%@", [NSThread currentThread]);
    
    [self performSelectorInBackground:@selector(threadTest1) withObject:nil];
    //必须调用对象本身实现了的方法
    [field performSelectorInBackground:@selector(setPlaceholder:) withObject:@"线程"];


- (void)threadTest1
{
    @autoreleasepool {
        
        NSLog(@"执行后:%@", [NSThread currentThread]);
    }

}


二、NSThread的多线程技术

 1> 类方法创建线程后直接启动

    detachNewThreadSelector

 

 2> 成员方法,在实例化线程对象之后,调用start方法启动线程

    initWithTarget

 

 对于NSThread的简单使用,可以用NSObject的performSelectorInBackground替代

 

 同时,在NSThread调用的方法中,同样要使用autoreleasepool进行内存管理,否则容易出现内存泄露。


代码实例:

<pre name="code" class="objc">//新建一个后台线程,调用目标的@selector方法
    [NSThread detachNewThreadSelector:@selector(threadTest1) toTarget:self withObject:nil];
    //成员方法
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadTest1) object:nil];
    //启动线程
    [thread start];
- (void)threadTest1
{
    @autoreleasepool {
        
        NSLog(@"执行后:%@", [NSThread currentThread]);
    }

}


三、 NSOperation,面向对象的多线程技术

 

 1> 使用步骤:

    1) 实例化操作

        a) NSInvocationOperation

        b) NSBlockOperation

    2) 将操作添加到队列NSOperationQueue即可启动多线程执行

 

 2> 更新UI使用主线程队列

    [NSOpeationQueue mainQueue] addOperation ^{};

 

 3> 操作队列的setMaxConcurrentOperationCount

    可以设置同时并发的线程数量!

 

    提示:此功能仅有NSOperation有!

 

 4> 使用addDependency可以设置任务的执行先后顺序,同时可以跨操作队列指定依赖关系

 

    提示:在指定依赖关系时,注意不要循环依赖,否则不工作。

代码实例:

<pre name="code" class="objc">NSOperationQueue *mainQueue = [[NSOperationQueue alloc] init]; 
	通过使用 NSOperationQueue 可以实现线程的顺序运行,代码如下:
	
//设置最大线程数量
[mainQueue setMaxConcurrentOperationCount:10];
//下载
        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"正在下载 %@", [NSThread currentThread]);
        }];
        //滤镜
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"滤镜 %@", [NSThread currentThread]);
        }];
        //显示
        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"更新UI %@", [NSThread currentThread]);
        }];
        //添加操作之间的依赖关系,即一个执行完以后,另一个才能执行
        //依赖关系可以跨线程队列
        [op2 addDependency:op1];
        [op3 addDependency:op2];
        
        
        [mainQueue addOperation:op1];
        [mainQueue addOperation:op2];
        [[NSOperationQueue mainQueue] addOperation:op3];


 
//下载
        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"正在下载 %@", [NSThread currentThread]);
        }];
        //滤镜
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"滤镜 %@", [NSThread currentThread]);
        }];
        //显示
        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"更新UI %@", [NSThread currentThread]);
        }];
        //添加操作之间的依赖关系,即一个执行完以后,另一个才能执行
        //依赖关系可以跨线程队列
        [op2 addDependency:op1];
        [op3 addDependency:op2];
        
        
        [_mainQueue addOperation:op1];
        [_mainQueue addOperation:op2];
        [[NSOperationQueue mainQueue] addOperation:op3];





   四、GCD,C语言

 GCD就是为了在“多核”上使用多线程技术

 

 1> 要使用GCD,所有的方法都是dispatch开头的

 2> 名词解释

 global  全局

 queue   队列

 async   异步

 sync    同步

 

 3> 要执行异步的任务,就在全局队列中执行即可

 dispatch_async 异步执行控制不住先后顺序

 

 4> 关于GCD的队列

 全局队列    dispatch_get_global_queue

 参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT

 始终是 0

 串行队列

 主队列

 

 5> 异步和同步于方法名无关,与运行所在的队列有关!

 

 6> dispatch_sync(queue, ^{

         NSLog(@"a -> %@", [NSThread currentThread]);

         });

        无论是什么队列都是在主线程中运行

 同步主要用来控制方法的被调用的顺序


并行代码如下:

//1.队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.将任务异步执行 无法控制先后顺序
    dispatch_async(queue, ^{
        NSLog(@"a -> %@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"b - > %@", [NSThread currentThread]);
    });
    
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"main -> %@", [NSThread currentThread]);
    });

串行代码如下:
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{
        NSLog(@"a -> %@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"b - > %@", [NSThread currentThread]);
    });



UE5网络模块实战:属性复制、RPC与联机开发踩坑指南 多人联机开发中,网络同步是核心难题。UE5网络模块以服务器权威为基础,通过Actor复制、RPC和所有权机制实现多端状态一致。理解属性复制与OnRep回调、区分Server/Client/Multicast RPC的适用场景,是构建稳定联机架构的关键。本文结合数字孪生与多端协作场景,探讨如何将渲染与逻辑分离,并针对打包后网络失效、端口防火墙、崩溃排查等工程实践问题给出解决方案。通过蓝图接口解耦表现层,利用C++创建StaticMesh组件实现服务器逻辑与客户端表现分离,同时注意专用服务器不加载渲染依赖(如D 阅读详情

相关推荐

Windows 11 24H2 系统下,保姆级安装华为 eNSP 模拟器(含依赖软件下载与避坑指南)

本文提供Windows 11 24H2系统下华为eNSP模拟器的完整安装指南,涵盖系统配置调整、依赖软件安装及常见问题解决方案。特别针对新版系统的兼容性问题,提供详细的避坑步骤和优化建议,帮助网络工程师顺利完成eNSP模拟器的部署与使用。

weixin_42567752的博客 428

iOS 判断多个子线程都执行完成

- (void)requestDataList { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_asyn...

naziyu的博客 361

向量数据库:PGVector

PGVector 是一个基于 PostgreSQL 的扩展插件,为用户提供了一套强大的向量存储和查询的功能

m0_37559973的博客 1万+

iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

1.iOS的三种多线程技术   1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框...

alexhua1444的博客 422

ANSYS拓扑优化基础实例

唐深51CAE 2018/6/10 拓扑优化在工程设计中,常用于机械结构概念设计和轻量化设计,ANSYS通用有限元分析软件提供了强大的拓扑优化功能,本文将通过一个简单实例进行展示。 一、赵州桥 赵州桥又称安济桥,坐落在河北省赵县洨河上,建于隋朝年间公元595年~605年,由著名匠师李春设计建造,距今已有约1500年的历史,是当今世界上现存最早、保存最完整的古代敞...

TQT_CAE的博客 6027

Ubuntu20.04安装Ceres库

ceres真难安装。

little_white138的博客 8379

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

本文首发于我的个人博客:『不羁阁』 文章链接:传送门 本文用来介绍 iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。 通过本文,您将了解到: NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperation 操作依赖和优先级、线程间的通信、线程同步和线程...

weixin_34295316的博客 431

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2330

IOS NSOperationQueue(线程 封装操作)

#import "HMViewController.h" @interface HMViewController () @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; [self operationQueue2]...

weixin_30758821的博客 213

洛奇 服务器文件,MabinogiG20S2 [洛奇G20服务端]

Code:Titles:>set_title /id: /add /remove Parameters for titles>set_title /id:60001 /add add devcat title>set_title /id:60001 /remove remove devcat title===========================...

weixin_30813385的博客 4307

Vue3+Vite+Electron桌面应用开发:从零到打包的完整避坑指南

本文是一份详尽的Vue3+Vite+Electron桌面应用开发实战指南。文章从项目初始化、环境配置、主进程构建、Vite深度优化,到最终的打包配置与优化,系统性地讲解了使用现代前端技术栈开发跨平台桌面应用的完整流程,并重点分享了开发与打包过程中的常见“坑点”与解决方案,旨在帮助开发者高效构建稳定可交付的桌面端应用。

hh234的博客 108

多线程在iOS开发中的应用

什么是主线程? 一个iOS程序运行之后,会默认开启一个线程,这个线程就叫做“主线程”或“UI线程” 主线程的主要作用: 显示/刷新UI界面 处理UI事件(比如点击事件,滚动事件,拖拽事件等) 主线程的使用注意: 别将耗时操作放到主线程中 耗时操作会卡住主线程,如果将耗时操作放到主线程上,那么只能等耗时操作执行完了之后,才会响应事件。 正确的做法:开启一个子线程,将耗时操作放在子线程(后台线程,非...

superyuan567的博客 325

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程

YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1493

iOS中的多线程

首先,介绍下,为什么要使用多线程。

fiona_yang123456的专栏 607

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IOS中的多线程

一、操作系统中的几个基本概念进程(process):指一个正在运行的可执行程序(应用程序),它可以包含多个线程。 线程(thread):指独立执行的代码片段,最小的执行单位。一个进程中所有的任务都在线程中执行。 任务(task):表示需要执行的工作。它是一个抽象的概念。线程的三种状态:运行(running)、就绪(ready)、阻塞(blocked)。线程持续在这三个状态之间切换,直到它最终退出

Smiling8866的博客 617

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

浅谈iOS中的多线程

一.相关概念: 1.多线程的概念: 程序:代码编译后, 形成的执行文件 进程:程序运行起来, 就是进程, 进程会为程序提供运行所需的内存, CPU, 端口等等 线程:分配资源 注: 进程中至少要有一个线程(主线程), 如果主线程阻塞, 程序就会假死; 如果主线程停止运作, 程序将终止 2.没有使用多线程的应用, 有什么问题? 当处理复杂的数据操作时, 就会阻塞主线程

TheMonster13的博客 518

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ios中的多线程的用法总结

ios中的多线程的用法总结 1、进程的基本概念 (1)每一个进程都是一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况 (2)同一个进程的线程共享内存中的内存和资源 2、多线程的基本概念 (1)每一个程序都有一个主线程,程序启动时创建(调用main来启动)。 (2)多线程技术表示,一个应用程序有多个线程,使用多线程能提供CPU的利用率,防止主线程被堵塞。 (3)任何有可能堵塞主线程的任务不要在主线程执行(如:访问网络)。 (4)主线程的生命周期和应用程序绑定着,程序

Eduora_meimei的专栏 1293

iOS中的多线程使用

iOS中的多线程方案

realank的专栏 427

《iOS高级编程》中的多线程与GCD

文章目录关于我的仓库前言准备工作什么是多线程以及GCD做了什么多线程的定义补充知识:进程与线程补充知识:CPU,CPU核以及时间片多线程利弊GCD中的APIDispatch Queuedispatch_queue_createMain Dispatch Queue/Global Dispatch Queuedispatch_set_target_queuedispatch_afterDispatc...

KevinAshen的博客 489

iOS 开发中的多线程

线程、进程 什么是线程、进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~。其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载三个文件就是多线程。一个进程可以只包含一个线程去处理事务,也可以有多个线程。 <!--more--> 多线程的优点和缺点   多...

weixin_34410662的博客 91

iOS中的三种多线程

iOS提供了三种多线程的技术:NSThread;NSOperation和NSOperationQueue;GCD 1.使用NSThread创建多线程: 创建NSThread线程有实力方法和类方法两种方法 2.使用GCD实现多线程: 相对于要手动管理线程同步安全的NSThread方法,GCD则要简单得多。GCD的核心是队列,使用GCD来实现多线程只需要创建队列,并把任务放在队列中处理。GCD的队列类型如下: 3.使用NSOperation与NSOperationQueue实现多线程: NSOperation和

xgc阳光的博客 735
上一篇: iOS之UITextField设置leftView与rightView
下一篇: iOS 访问手机相册以及从相册获取相片
fddbailing
博客等级 码龄14年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值