【iOS】从实际出发理解多线程(二)--NSThread基础操作

简介

NSthread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用较少,常用的就是下面的方法来获取当前线程。

[NSThread currentThread]

使用

1.实例初始化、属性和实例方法

初始化

切记下面两个方法初始化的NSThread必须手动start开启线程
//创建线程
NSThread *newThread = [[NSThread alloc]initWithTarget:self selector:@selector(demo:) object:@"Thread"];
//或者
NSThread  *newThread=[[NSThread alloc]init];
NSThread  *newThread= [[NSThread alloc]initWithBlock:^{NSLog(@"initWithBlock");
}];

属性

线程字典

/**
每个线程都维护了一个键-值的字典,它可以在线程里面的任何地方被访问。
你可以使用该字典来保存一些信息,这些信息在整个线程的执行过程中保持不变。
比如,你可以使用它来存储在你的整个线程过程中 Run loop 里面多次迭代的状态信息。
NSThread实例可以使用以下方法
*/@property (readonly, retain) NSMutableDictionary *threadDictionary;
NSMutableDictionary *dict = [thread threadDictionary];  

 

优先级

@property double threadPriority ; //优先级

线程优先级

/** NSQualityOfService:NSQualityOfServiceUserInteractive:最高优先级,主要用于提供交互UI的操作,比如处理点击事件,绘制图像到屏幕上NSQualityOfServiceUserInitiated:次高优先级,主要用于执行需要立即返回的任务NSQualityOfServiceDefault:默认优先级,当没有设置优先级的时候,线程默认优先级NSQualityOfServiceUtility:普通优先级,主要用于不需要立即返回的任务NSQualityOfServiceBackground:后台优先级,用于完全不紧急的任务
*/
@property NSQualityOfService qualityOfService

线程名称

@property (nullable, copy) NSString *name;

线程使用栈区大小,默认是512k

@property NSUInteger stackSize ;

线程状态(正在执行、执行结束、是否可以取消)

@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isCancelled) BOOL cancelled;

实例方法

// 启动线程  实例化线程需要手动启动才能运行
- (void)start;
[thread stary]// 是否为主线程
- (BOOL)isMainThread; 
isMain = [thread isMainThread];//设置线程名称
- (void)setName:(NSString *) name;
[thraed setName:@"name"];// 取消线程 
- (void)cancel;
[thread  cancel];// 线程的入口函数
- (void)main; 
[thread main];// 线程是否正在执行
- (void)isExecuting;
isRunning=[thread isExecuting];// 线程是否已经结束
- (void)isFinished;
isEnd=[thread isFinished];// 线程是否撤销
- (void)isCancelled;
isCancel=[thread isCancelled];

类创建方法

/*创建子线程并开始创建后就可执行,不需要手动开启
但是不能获取NSThread对象
*//**block方式 具体的任务在Block中执行 */ + (void)detachNewThreadWithBlock:(void (^)(void))block; /**SEL方式利用selector方法初始化NSThread,target指selector方法从属于的对象 selector方法也 是指定的target对象的方法 */ + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

类使用方法

// 获取当前线程
+ (void)currentThread;
[NSThread currentThread];//当前代码运行所在线程是否为子线程
+ (BOOL)isMultiThreaded;
isMulti = [NSThread isMultiThreaded];// 当前代码所在线程睡到指定时间  
+ (void)sleepUntilDate: (NSDate *)date; 
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];// 线程沉睡时间间隔,这个方法在设置启动页间隔的时候比较常见
+ (void)sleepForTimeInterval: (NSTimeInterval)time;
[NSThread sleepForTimeInterval:1.0];// 退出当前线程
+ (void)exit;
[NSThread exit];// 设置当前线程优先级
+ (double)threadPriority;
double dPriority=[NSThread threadPriority];// 给当前线程设定优先级,调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高。
+ (BOOL)setThreadPriority:(double)priority;
BOOL isSetting=[NSThread setThreadPriority:(0.0~1.0)];// 线程的调用都会有行数的调用函数的调用,就会有栈返回地址的记录,
在这里返回的是函数调用返回的虚拟地址
说白了就是在在该先出中函数调用的虚拟地址的数组
+ (NSArray *)callStackReturnAddresses;
NSArray *addressArray=[NSThread callStackReturnAddresses];// 同上面的方法一样,只不过返回的是该线程调用函数的名字数字
+ (NSArray *)callStackSymbols;
NSArray* nameNumArray=[NSThread callStackSymbols];注意:callStackReturnAddress和callStackSymbols这两个函数可以同NSLog联合使用来跟踪线程的函数调用情况,是编程调试的重要手段

 隐式创建&线程间通讯

以下方法位于NSObject(NSThreadPerformAdditions)分类中,所有继承自NSObject实例化对象都可以调用以下方法。

/**指定方法在主线程中执行参数1. SEL 方法2.方法参数3.BOOL类型  表示是否等待当前aSelector方法执行完毕4.指定的Runloop model
*/
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;// equivalent to the first method with kCFRunLoopCommonModes
/**指定方法在某个线程中执行参数1. SEL 方法2.方法参数3.是否等待当前执行完毕4.指定的Runloop model
*/
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));// equivalent to the first method with kCFRunLoopCommonModes
/**指定方法在开启的子线程中执行参数1. SEL 方法2.方法参数
*/
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));

注意:我们提到的线程间通讯就是这几个方法,没有多高大上多复杂。

再注意:苹果声明UI更新一定要在UI线程(主线程)中执行,虽然不是所有后台线程更新UI都会出错。

再注意:waitUntilDone后面的这个BOOL类型的参数,这个参数的意义有点像我们是否同步执行aSelector这个任务!具体的看下面两张图的内容就一目了然了。

 

 

转载于:https://www.cnblogs.com/weicyNo-1/p/11074307.html

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

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

相关文章

双绞线制作方法和标准

双绞线的制作方法&#xff1a; 标准568B&#xff1a;橙白--1&#xff0c;橙--2&#xff0c;绿白--3&#xff0c;蓝--4&#xff0c;蓝白--5&#xff0c;绿--6&#xff0c;棕白--7&#xff0c;棕--8 (如图2&#xff09; 标准568A&#xff1a;绿白--1&#xff0c;绿--2&#xff0c…

深入理解Java枚举类型(enum)

理解枚举类型 枚举类型是Java 5中新增特性的一部分&#xff0c;它是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举…

Flash/Flex学习笔记(47):反向运动学(上)

先回顾上篇所说的"正向运动学"&#xff1a;以人行走的例子来说&#xff0c;基本上可以理解为大腿驱动小腿&#xff0c;小腿驱动脚&#xff0c;从而引发的一系列姿态调整和运动。再举一个例子&#xff0c;我们用着拿一根软鞭或链条的一端挥舞&#xff0c;被手挥舞的这…

java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言之所以使用JNDI 是出于通用性考虑&#xff0c;该例子使用JMS规范提供的通用接口&#xff0c;没有使用具体JMS提供者的接口&#xff0c;这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。什么是JNDI&#xff1a;JNDI(Java Naming and Directory Inte…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域&#xff0c;k 为第k各最大值&#xff0c;Small 与之对应返回第k个最小值。 注意&#xff1a;单元格区域中的非数字会被忽略掉。 例子如下&#xff1a; 可以类比Rank的用法&…

mac系统下android studio创建手机模拟器

打开android studio&#xff0c;点击右上角的模拟器图标&#xff0c;打开“Android Virtual Device Manager” 窗口&#xff0c;如下图 点击“Create Virtual Device”&#xff0c;在打开的设备定义列表中&#xff0c;选择“Phone -> Nexus 5X”&#xff0c;右边列出了改机型…

如何设置Hyper-V的虚拟机快捷方式

在Windows Server 2008中&#xff0c;提供的Hyper-V功能&#xff0c;可以很方便地在企业环境中部署多个虚拟机&#xff0c;以适应不同的开发需要。一般我们都是通过下面的方式 1. 打开服务器管理器 2.打开Hyper-V管理器&#xff0c;找到有关的虚拟机&#xff0c;然后右键点击“…

java跨函数跳转_VS code 函数无法跨文件跳转到定义

现状&#xff1a;本文件函数通过this打点调用的函数&#xff0c;引入绝对路径的文件&#xff0c;调用的函数都可以通过Ctrl 点击 实现跳转到定义处。而如果在 webpack 通过alias 设置了别名&#xff0c;无法跳转成功。解决方案: 新建文件 jsconfig.json&#xff0c;配置如下。…

python enumerate()

描述 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 语法 以下是 enumerate() 方法的语法: enumerate(sequence, [start0]) 参数 sequence -- 一个序列、迭代器…

java 怎么页面授权访问_Java调用Linkedin接口API之:获取授权

配置领英应用配置地址&#xff1a;https://www.linkedin.com/secure/developer?newapp强烈建议您使用 HTTPS网址必须是绝对网址 (例如: “https://example.com/auth/callbac”&#xff0c;而不是“/auth/callback”)网址参数会被忽略 (即 https://example.com/?id1 与 https:…

win7 'IIS APPPOOL\Classic .NET AppPool' 登录失败

进入iis管理器 本地应用程序池 选中classic. net appPool 选择右侧的 高级设置 进程模型 标识 将内置账户改为LOCAL SYSTEM 转载于:https://www.cnblogs.com/3rocks/archive/2010/06/02/1750091.html

MariaDB数据库5-password、galera

转载于:https://www.cnblogs.com/WIU1905/p/11100917.html