runloop 笔记

Runloop初探笔记 OC版runloop是C版CFRunLoopRef的封装: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSLog(@"%p----%p", [NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]); NSLog(@"% 阅读详情

1.使程序一直运行并接受用户输入
2.决定程序在何时应该处理那些Event
3.调用解耦(Message Queue)
4.节省CPU时间

主线程几乎所有的函数都从以下六个之一的函数调用器

    static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__();  
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__();  
    static void __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__();  
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__();  
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__();  
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__();  

CFRunloop 和Thread 一一绑定。

CFRunloopMode —-
CFRunLoopSource - CFRunLoopTimer – CFRunLoopObeserver

这里写图片描述

RunLoopTimer 的封装

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;//延时执行

- (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;//刷新频率 和系统ui 刷新率一样

- (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode;

Source 是Runloop的数据源的抽象类(Protocol)实际他这个就能用了
RunLoop 定义了两个Version的Source:
1.Source0:处理App内部事件、App自己负责管理(触发)、如UIEvent、CFSocket(可以打断点看)
2.Source1:由RunLoop和内核管理、Mach port(轻量级进程间通讯的一种方式)驱动、如CFMach port 、CFMessagePort(系统用Source1 实现的)。认为是进程间的端口,往进程发消息,就是往进程的端口发消息。端口被监听的话就会收到消息。

observer 枚举
entry 进入 before time before source 将要执行 before wait 将要sleep睡眠了 after wait 我被唤醒了 exit 退出

CAAnimation 用了这个不会代码一执行就跑 在before wait 和after wait 才做动画操作。保证所有信息都拿到了

autorelease pool对象到底什么时候释放:
在runloop 处于observer 触发的时候释放的。

runloop 在同一时间只能并且必须在一种特定Mode 下Run
更换Mode 时候,需要停止当前的Mode,然后重启新的Loop
mode 是ios APP滑动顺畅的关键

NSDefaultRunLoopMode(不滑动。默认空闲的mode)
UITrackingRunLoopMode(滑动mode)
UIInitializationRunLoopMode(私有,启动到显示ui之间出现的)
NSRunLoopCommonModes(自己定义 或者 默认某些mode 的集合 )
( 默认 为NSDefaultRunLoopMode+ UITrackingRunLoopMode)
(可以自己给mode 添加某些模型)

经典问题: nstimer

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
timer 会自己添加一个mode

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
受到滑动事件的影响。需要给timer 增加一个commonmode 才可以滑动时显示timer数据
- (void)addTimer:(NSTimer *)timer forMode:(NSRunLoopMode)mode;

滑动的时候

runloop会从default 转换成tracking滑动 在滑动将要结束时候再转换为 default模式

和GCD的关系

只和get main queue 有关 因为主线程唯一性
gcd 中分发到主线程 就是转交给runloop处理

空闲时刻等待 和唤醒

睡眠状态和mach-port 有关
一.会指定一个用于唤醒的端口,发送一个消息给内核,
让内核处于接收状态,就变成处于等待状态了(sleep)
等待内核唤醒

二.调用mach_msg 监听唤醒端口、
被唤醒前、系统内核将这个线程挂起、停留在mach_msg_trap状态
(是开放的,可以调用)

三、由另外一个线程(或另外一个进程中的某个线程) 向内核发送这个
端口的msg后,trap状态被唤醒。Runloop 继续开始干活

Runloop的执行顺序 do while:
1.设置过期时间 不能出现死循环 gcd timeout
2.告知obesrve状态: before time before source
3.Do blocks Do sources0(看有没有消息)
4. check GCD(有没有调用主线程的东西需要Runloop去处理)
5. 告知obeserve 处于 before waiting状态了
6. 发出端口号—-变为睡眠状态
7. ——————接下来是漫长的等待,直到有唤醒为止————–
8. 接收到了唤醒消息
9. 告诉obeserver 处于 after watiting 状态了
10. 开始处理事件
11. 如果是timer 唤醒的—- 就处理timer。多个timer 就排序。。。cfrunloop等
12. 如果是主线程gcd唤醒的— 就去处理gcd
13. 都不是的话—- 就是source 1(基于port的)—- (比如说NSURLConnection网络某个端口来数据了)
15. 如果没有接收到超时 和 外部干掉了runloop 就会循环这个

runloop 实践
1.AFN 旧版本怎么用runloop创建一个常驻线程的

-(void)networkRequestThreadEntryPoint:(id)__unused object{
    @autoreleasepool {
        [[NSThread currentThread] setName:@"AFNetworking"];
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];//起一个监听的作用,保证runloop不会退出
        [runLoop run];
    }
}
- (NSThread *)netwoekRequestThread {
    static NSThread *_networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate,^{
        _netWorkRequestThread = 
        [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [_netWorkRequestThread start];
    });
    returen _netWorkRequestThread;
}

语音就可以模仿这个.按住说话,设置一个常驻线程,
平常啥也不干,到需要说话的时候,就把语音唤醒。

2.设置图片,防止图片滑动的时候卡,不需要判断是否处于滑动状态了

[self.avatarImageView performSelector:@selector@(setImage:) withObject:downLoadImage afterDelay:0 inModes:@[NSDefaultRunLoopMode]];

3.接到Crash 的siganal 后手动重启RunLoop。弹出友好提示。

CFRunLoopRef runLoop = CFRunLoopGetCurrent();
NSArray *allModes = CFBridgingRelease(CFRunLoopCopyAllModes(runLoop));
while(1) {
    for (NSString *mode in AllModes) {
        CFRunLoopRunInMode((CFStringRef)mode,0.001,false);
    }
}

4.异步test case

-(void)runUntilBlock:(BOOL(^)())blcok tineout:(NSTimrInterval)timeout {
    NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:timeout];
    do {
        CFTimeInterval quantum = 0.0001;
        CFRunLoopInMode(KCFRunLoopDefaultMode,quantum,false);
    }while{[timeoutDate timeIntervalSinceNow]>0.0 && !block()};
    //每0.0001秒验证
}
//改成runloop sleep 之前验证
....太长不抄了

参考文章
iOS刨根问底-深入理解RunLoop
一个tableview滑动优化
RunLoop总结:RunLoop的应用场景(三)滚动视图流畅性优化

华为od机试|华为od机试真题2025|华为od题库|华为od机考|2025C卷B卷 华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|B卷C卷 阅读详情

相关推荐

遥感图像小白--2--图像分割

遥感图像分割基础入门

Mary的博客 4237

8、CFRunLoopMode

简单的说run loop是事件驱动的一个大循环,如下代码所示 int main(int argc, char * argv[]) { //程序一直运行状态 while (AppIsRunning) { //睡眠状态,等待唤醒事件 id whoWakesMe = SleepForWakingUp(); //得到唤醒

zwcshy的专栏 594

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

【精】Runloop 深入浅出,综合解答

Runloop 概述1、与下面知识相关:系统级:GCD,mach kernel,block,pthread应用层:NSTimer,UIEvent,自动释放池,NSObject(NSDelayedPerforming),NSObject(NSThreadPerformAddition),CADisplayLink,CATransition,CAAnimation,dispatch_get_main_

郭晓东的专栏 9326

使用-flat.vmdk文件恢复ESXI虚拟机的vmdk文件

解决flat.vmdk文件丢失恢复问题

神秘人的博客 6775

PCB过孔电流承载解析:完整指南与数据参考

深入解析PCB过孔的电流承载能力,结合实际应用场景提供可靠设计参考。涵盖影响载流的关键因素,并整理实用的pcb过孔与电流对照一览表,帮助工程师优化布局与布线。

weixin_35677363的博客 632

浅谈iOS中的RunLoop

首先解释下为什么是浅谈,主要是RunLoop这个东西不单单是iOS的范畴,还涉及到操作系统,我指的浅谈仅仅针对iOS上层应用,底层的东西概不涉及 ,所以只能浅谈浅谈了。 在浅谈RunLoop之前我们来写个小demo,超级简单,一个按钮,然后给按钮一个断点 这块标记了1,2,3,4 红色的字;其实这是这个APP启动的一个过程 但是说好了浅谈RunLoop为啥又扯到APP的启动了

chmod_R_755的专栏 1万+

nnDetection实战:手把手教你用Python在自家电脑上跑通第一个肺结节检测模型

本文详细介绍了如何使用nnDetection框架在普通电脑上实现肺结节检测模型的搭建与运行。从环境配置、数据预处理到模型训练与推理,手把手教你完成医学图像检测的全流程,特别适合初学者入门医学AI领域。

weixin_32377497的博客 331

iOS高级技术:NSRunLoop须知(面试必备)

什么是RunLoop从字面意思看,就是运行循环,兜圈圈儿。 运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop。 基本作用 1、保持程序的持续运行,接受用户输入

biyuhuaping的专栏 1085

Python爬虫selenium验证-中文识别点选+图片验证码案例

环境对模型进行训练,参考:https://github.com/sml2h3/dddd_trainer。能识别,但是发现默认识别率有点低,想要提升识别率,可以搭建。截图每个字符,并基于ddddocr识别。根据坐标,在验证码上进行点击。

dme.的博客 2165

Chamfer Loss

ChamferLoss是一种常用于3D点云(pointcloud)处理的损失函数,特别是在点云生成和对齐任务中。它的目的是度量两个点集之间的相似度,特别是在点云重建、配准或生成等任务中,常用于优化模型使得生成的点云更接近真实的点云。

夜空中明亮的星的专栏 455

iOS runloop详解

写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是死锁具体是怎么回事,我只是记得有这个说法,也发现了一个自己不懂的知识。 初识runloop 我在网上看了一下@sunnnyxx 关于runloop的视频.了解了一下runloop相关知识,也去网络上看各种关于runloop的讲述。 ...

204

RK3588 , 基于mpp 解码 Jpeg To RGB

本文介绍了在RK3588开发板上使用Rockchip MPP(Media Process Platform)硬件加速接口将JPEG图像解码为RGB格式的完整流程。主要包括三个关键步骤:1) 读取JPEG文件数据;2) 配置MPP解码器,包括初始化上下文、设置RGB888输出格式和解码参数;3) 执行解码任务并将结果保存为图像文件。通过硬件加速,该方法能高效完成JPEG到RGB的转换,适用于嵌入式多媒体处理场景。

J。 1212

RunLoop笔记

原文:Runloop基础元素解析http://www.jianshu.com/p/8b9c81a521bc?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-timeline&from=timeline&isappinstalled=0 Ru...

aocanyou7652的博客 175

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

iOS Runloop面试小笔记

Runloop 与线程有什么关系? 为什么只有主线程的 Runloop 是开启的? PerformSelector 和 Runloop的关系?

飞跃 Ni Wo Ta 2240

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS runloop笔记

记录一下前几天的学习内容 网上有两篇文章写的很好 第一篇 第二篇 // // ViewController.m // Runloop // // Created by Civet on 2020/6/28. // Copyright © 2020年 icivet. All rights reserved. // //https://www.jianshu.com/p/ac05ac8428ac //https://www.jianshu.com/p/fcb271f69038 // 默认模式

qq_38360004的博客 218

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RunLoop笔记之使用

(因为run和loop是两个词所以首字母均大写) 1 创建常驻线程 主线程不死是因为主线程里面有一个RunLoop,RunLoop里面有一个do while死循环,保证了程序的不退出。那么如果我们有一个需求,需要一直在后台进行某个耗时操作,比如检查联网状态,比如扫描用户的某些行为等等。这时候肯定要在子线程进行,如果能保证一个子线程的不死,就能避免频繁的创建与销毁线程. 方...

aocanyou7652的博客 198

RunLoop 相关知识笔记

RunLoop 相关知识笔记 Runloop 什么是RunLoop? RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。 1、没有消息需要处理时,休眠以避免资源占用(用户态->内核态) 2、有消息需要处理时,立刻被唤醒(内核态->用户态) Runloo的基本作用 保持程序的持续运行 处理App中的各种事件(比如触摸事件、定时器事件等) 节省CPU资源,提高程...

WJ的博客 344

iOS RunLoop笔记

RunLoop一:简介基本作用* 保持程序的持续运行* 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件) * 节省CPU资源,提高程序性能:该做事时做事,该休息时休息* 没有RunLoop的情况下,第3行后程序就结束了 main函数中的RunLoop* 第14行代码的UIApplicationMain函数内部就启动了一个RunLoop* 所以UIApplicationMain

流言止于智者。 387

Runloop笔记

一、Runloop简介: Run loops 是线程相关的的基础框架的一部分。一个 run loop 就是一个事件处理 的循环,用来不停的调度工作以及处理输入事件。 使用 run loop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。 Runloop还可以在loop在循环中的同时响应其他输入源,比如界面控件的按钮,手势等。   Run loop

qianxun_ios的博客 354

Runloop 解释笔记

Runloop是iOS开发的一个难点,需要不断体会才能真正理解。 一个runloop有几个要素组成,一个是runloop模式,一个是source,一个是observer。runloop模式是需要监视的source和observer的集合,runloop运行期间,只有和该模式相关的source才会被监视并允许传递事件,也只允许相关的observer会被通知runloop的进程。 source分

Linlei的专栏 607

iOS学习笔记【三】——RunLoop

iOS学习笔记【三】——RunLoop

tmyttt2333的博客 245

RunLoop简单笔记

为什么80%的码农都做不了架构师?>>> ...

weixin_34383618的博客 185
上一篇: Objective-C对象模型
下一篇: 一次头脑风暴
csdn_Damon
博客等级 码龄10年 37粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值