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]);
    });



【Qt】Qt5.15在线安装避坑指南:从代理配置到组件选择的完整实践 本文详细介绍了Qt5.15在线安装的全流程避坑指南,包括代理配置、组件选择和常见问题解决方案。通过使用Fiddler工具和国内镜像源,可显著提升下载速度。文章还提供了组件选择的黄金法则和安装后的验证步骤,帮助开发者高效完成Qt5.15的安装与配置。 阅读详情

相关推荐

【CV论文精读】【协同感知综述】Collaborative Perception for Autonomous Driving :Current Status and Future Trend

感知是自动驾驶系统的关键模块之一,近年来取得了很大进展。然而,单个车辆的有限能力导致感知性能提高的瓶颈。为了突破个体感知的局限,协作感知被提出,它使车辆能够共享信息来感知视线和视野之外的环境。本文综述了有前途的协作感知技术的相关工作,包括介绍了基本概念,概括了协作模式,总结了协作感知的关键要素和应用。最后,我们讨论了这一研究领域面临的挑战和问题,并给出了一些潜在的进一步方向。

weixin_44184852的博客 4690

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

用workbuddy自定义Skill:手把手搭建AI炒股分析助手

AI Agent正成为个人投资研究的重要工具,而Skill作为行为规范,能让AI输出保持稳定与专业。在AI Agent应用中,很多人分不清Skill与Agent的区别:Agent负责目标拆解与执行,Skill则固化分析流程与输出模板。借助本地工作台workbuddy,用户可自定义Skill,实现从市场环境检查到财务排雷的五段式分析。通过调低温度参数、设定数据验证规则,该方案能有效避免大模型凭空编造数据,帮助个人投资者快速完成基本面体检、资金面观察与风险清单生成。本文基于一套可直接套用的配置与一个月实测,展示

weixin_29038537的博客 529

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

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

alexhua1444的博客 422

sentaurus学习笔记(HFET_pGate_GaN仿真)(九)

`(sdedr:define-constant-profile-placement "Ohmic.s" "Ohmic" "Pl.ohmic.s" 0.002)`这一行将`"Ohmic"`掺杂剖面放置在`"Pl.ohmic.s"`参考评估窗口中,同样`0.002`可能表示掺杂剖面在窗口中的偏移量或其他参数。欧姆接触是半导体器件中的一种低阻抗电气接触,通常需要高掺杂来减少接触电阻并提高器件性能。通过这些步骤,SDE能够为器件的源极和漏极区域设置高掺杂的欧姆接触,这对于确保器件的高性能和低接触电阻至关重要。

qq_52640792的博客 1382

stm32F103定时器使用方法

文章目录1、STM32的Timer简介2、普通定时器TIM2-TIM52.1 时钟来源2.2 计数器模式2.3 编程步骤3、程序源代码4、总结 1、STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟

weixin_43582209的博客 4515

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

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

weixin_34295316的博客 431

灯塔问题:贪心与动态规划算法解析

区间覆盖问题是算法设计中的经典案例,常用于理解贪心算法与动态规划的核心差异。贪心算法通过局部最优选择逐步构建全局解,具有O(n log n)的高效时间复杂度,特别适合处理一维区间覆盖场景。动态规划则采用自底向上的填表法,虽然通用性更强但复杂度较高。在实际工程中,这类算法广泛应用于无线基站部署、监控设备布置等资源优化场景。通过分析灯塔问题的两种解法,可以深入掌握算法选择的关键因素,如问题规模、性能要求和实现复杂度。

weixin_28720573的博客 259

IOS NSOperationQueue(线程 封装操作)

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

weixin_30758821的博客 213

如何在iPhone上本地运行SmolVLM?5亿参数模型实战指南(附Swift代码)

本文详细介绍了如何在iPhone上本地部署和运行轻量高效的SmolVLM多模态模型。通过实战指南,分享了使用Swift和MLX框架进行环境配置、模型加载、内存优化以及实现实时图像分析与文本生成的完整流程,帮助开发者在移动端高效运行AI视觉语言模型。

echo99的专栏 654

Flink Web UI 如何使用和调试保姆级教程(持续更新)

Running Jobs(运行中的作业):显示正在运行的所有 Flink 作业的列表。每个作业都有一个独特的 Job ID,可以点击进入查看作业的详细信息。Completed Jobs(已完成的作业):显示已经完成或取消的作业列表。:显示当前集群中所有 TaskManager 的健康状态,包括 CPU 使用率、内存使用情况、Slot 数量等。Job Manager Configuration(JobManager 配置):显示 JobManager 的一些配置参数,帮助调试和优化 Flink 集群。

大模型大数据攻城狮的专栏 3991

多线程在iOS开发中的应用

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

superyuan567的博客 325

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

iOS中的多线程

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

fiona_yang123456的专栏 607

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IOS中的多线程

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

Smiling8866的博客 617

NTscan扫描工具

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

浅谈iOS中的多线程

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

TheMonster13的博客 518

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、付费专栏及课程。

余额充值