iOS NSRunLoop跟NSTimer的问题

本文深入解析NSRunLoop在iOS消息机制中的作用,详细阐述了其如何控制线程执行和休眠,以及如何处理不同类型的事件源和定时器。通过一个实例展示如何在滚动视图时注册并管理计时器,同时调整runloop模式以确保同时接收多个runloop的消息。文章旨在帮助开发者更好地理解和利用NSRunLoop,优化iOS应用的响应性和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

i我们首先来了解一下什么是NSRunLoop
1.NSRunLoop是IOS消息机制的处理模式
NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。

2.NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。 3.runloopmode是一个集合,包括监听:事件源,定时器,

我们在使用NSTimer的时候,可能会接触到runloop的概念,下面是一个简单的例子:

- (void)setupTimer {
    // 创建一个计时器
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:self.autoScrollTimeInterval target:self selector:@selector(automaticScroll) userInfo:nil repeats:YES];
    // 自身的计时器指向这个计时器
    _timer = timer;
}

这个时候如果我们在界面上滚动一个scrollview,那么我们会发现在停止滚动前,控制台不会有任何输出,就好像scrollView在滚动的时候将timer暂停了一样,这其实就是runloop的mode在做怪。
runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。

接着上面的话题,在开启一个NSTimer实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下,是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样)要想在scrollView滚动的同时也接受其它runloop的消息,我们需要改变两者之间的runloopmode.

 // 消息机制的处理模式:
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值