浅谈一下对runloop的理解
一 什么是RunLoop?
从字面意思看就是运行循环,其实内部就是do-while循环,这个循环内部不断地处理各种任务(比 如Source,Timer,Observer)
一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(run方法)
RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source,Timer,Observer,那么就直接退出RunLoop
二 你在开发过程中怎么使用RunLoop?什么应用场景?
开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来的消息,处理其他事件)
在子线程中开启一个定时器
在子线程中进行一些长期监控
可以控制定时器在特定模式下运行
可以让某些事件(行为,任务)在特定模式下执行
可以添加observer监听RunLoop的状态,比如监听点击事件的处理(比如在所有点击事件前做一些处理)
//下面用代码来介绍runloop在线程中的运用
我们的目的是开辟一个子线程处理一些事件,然后将另一件事也放到第一个线程中处理
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)NSThread*thread;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton*but1=[UIButton buttonWithType:UIButtonTypeSystem];
[but1 setFrame:CGRectMake(50, 50, 40, 30)];
[but1 setBackgroundColor:[UIColor blueColor]];
[but1 addTarget:self action:@selector(text1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:but1];
UIButton*but12=[UIButton buttonWithType:UIButtonTypeSystem];
[but12 setFrame:CGRectMake(120, 50, 30, 30)];
[but12 setBackgroundColor:[UIColor redColor]];
[but12 addTarget:self action:@selector(text12) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:but12];
}
-(void)text1
{
NSLog(@"%@",[NSThread currentThread]);
self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(text2) object:nil];
[self.thread start];
}
-(void)text2
{
//获得当前子线程对应的runloop,也就是说一个进程的开始就会开启一个runloop对象,对于子线程的runloop对象是需要手动开启的,需要调用run方法;
NSRunLoop*runloop=[NSRunLoop currentRunLoop];
NSLog(@"2%@",[NSThread currentThread]);
//runloop的作用是为了保证线程的存活,这里的 NSTimer是保证runloop不退出,若没有runloop的运行模式的话,这个runloop就会自动退出,
// //1第一种方法加定时器
// NSTimer*timer=[NSTimer timerWithTimeInterval:2 target:self selector:@selector(too1 ) userInfo:nil repeats:YES];
// [runloop addTimer:timer forMode:NSDefaultRunLoopMode];
//
//2.给runloop加一个端口,保证runloop不退出
[runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[runloop run];
}
//点击第二个红色按钮后继续让第一个线程继续工作
-(void)text12
{
[self performSelector:@selector(text13) onThread:self.thread withObject:nil waitUntilDone:YES];//为了将其他的事件也在上一个线程中来执行,那么我们对上一个线程做了一个存活的处理,所以利用runloop来保证线程的存活,不让其退出;
}
-(void)text13
{
NSLog(@"13%@",[NSThread currentThread]);
}
转载于:https://www.cnblogs.com/wpw19920808/p/5760407.html
浅谈一下对runloop的理解相关推荐
- 浅谈 我对 技术 的理解
文章目录 1.浅谈 我对 技术 的理解 1.1 技术 是 什么? 1.2 技术的 两个 核心 构成 要素 1.2.1 知识 层面 1.2.2 智慧 层面(思考 层面) 1.3 技术 很难?学不明白? ...
- 浅谈对seo概念的理解
个人认为与微信一样,搜索引擎有固定的用户群体,有人有流量的地方,就存在商机或者利益,seo的概念就是搜索引擎优化,其目的是在搜索引擎中获得精准用户,获得流量.从更深层次方面看,利用seo做自然排名获得 ...
- 浅谈阿里“中台”概念的理解
https://www.toutiao.com/a6651015208934310414/?tt_from=mobile_qq&utm_campaign=client_share&ti ...
- 浅谈IO及不同的理解
IO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的.单独的程序一般是让系统为它们完 ...
- 浅谈我对JCS 的理解
JCS 是Java 中缓存的一种实现,支持将数据缓存到内存和硬盘中,支持设置缓存对象的有效时长. 我认为可以这么理解JCS:客户端向服务器发出请求,服务器就先去缓存中查一下有没有客户端请求的数据,有则 ...
- 浅谈数据库三大范式的理解
首先声明一下,我的这个回答是个人工作总结,不适合考试答题昂. 欢迎关注我的博客. 前言:数据库设计其实不仅仅限制于三个范式,往下其实还有很多种,但对于大多数人来说,你又不搞科研,不造飞机大炮,掌握三大 ...
- 浅谈对js闭包的理解
闭包就是能够读取其他函数内部变量的函数.由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成"定义在一个函数内部的函数".在本质上,闭包是将函数内 ...
- 【Docker】Docker镜像是什么?浅谈对Docker镜像的理解
专栏往期文章 <Docker是什么?Docker从介绍到Linux安装图文详细教程> <30条Docker常用命令图文举例总结> 本期目录 专栏往期文章 1. Docker镜像 ...
- 【代码注释】浅谈对于代码注释的理解
楔子:"这里的山路十八弯,这里的水路九连环":智慧的古人就懂得,通过把山路修成九曲十八弯来战胜陡峭的高坡.看则舍近求远绕圈而行,实为拿路程换高度,为完成登顶而蓄势待发.这种螺旋上升 ...
- 浅谈C语言中数组理解
前言:本人为c语言初学者,如果引用理解错误请各位指出!我定会虚心改正,和大家共同前行. 目录 1.初始化数组 2.给数组元素赋值 3.数组边界 4.指定数组的大小 5.多维数组 6.关于二维数组的初始 ...
最新文章
- 以下关于python缩进_Python 的缩进是不是反人类的设计?
- 嵌入式linux 用虚拟机,如何制作嵌入式Linux虚拟机
- 错误 LINK : fatal error LNK1158: 无法运行“rc.exe”
- 杂谈——杭州考驾照历程
- html实现图片加载动画效果,HTML5+javascript实现图片加载进度动画效果
- 原子操作、互斥锁、读写锁
- 转:Java中的异常处理
- [Go] 函数/方法 的 变参
- caffe入门教程1-环境搭建
- 技嘉主板bios怎么进入,如何进入技嘉主板的bios
- 5-热力学第二、三定律
- 围棋软件测试自学,围棋软件等级棋力水平测试(正版)
- Swagger2由入门到实战
- 什么是迭代(die dai)
- 笔记本电脑突然无法链接wifi、无法连接宽带
- 维乐美学系列:美丽背后的匠心打造
- arch linux简体中文,Locale (简体中文)
- 2016-3-14恬淡努力的一天
- 无图言屌?YYImage 设计思路,实现细节剖析
- 前端面试+学习笔记(HTML+CSS+JavaScript+ES6+Vue+NodeJs)