NStimer 被堵塞

我们在界面上滚动一个scrollview,那么我们会发如今停止滚动前,会发现NSTimer未被运行。就好像scrollView在滚动的时候将timer暂停了一样,在查看对应文档后发现,这事实上就是runloop的mode在做怪。

runloop能够理解为cocoa下的一种消息循环机制,用来处理各种消息事件。我们在开发的时候并不须要手动去创建一个runloop。由于框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们能够得到一个当前线程以下相应的runloop对象。只是我们须要注意的是不同的runloop之间消息的通知方式。

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



- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(printMessage:)

userInfo:nil repeats:YES];

	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

}

简单的说就是NSTimer不会开启新的进程,仅仅是在Runloop里注冊了一下。Runloop每次loop时都会检測这个timer,看能否够触发。当Runloop在A mode。而timer注冊在B mode时就无法去检測这个timer。所以须要把NSTimer也注冊到A mode。这样就能够被检測到。

时间: 2024-10-28 15:49:42

NStimer 被堵塞的相关文章

NSTimer

NSTimer叫做“定时器”,它的作用如下在指定的时间执行指定的任务每隔一段时间执行指定的任务 调用下面的方法就会开启一个定时任务+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;每隔ti秒,调用一次aTarget的aSelector方法,yesOr

mysql下的慢查询堵塞处理shell脚本

作为数据库肯定会有大量的select查询我们的数据库,而在实际生产环境中往往应为sql语句写的子查询略多或同大量的查询并发在一台数据库上都会造成堵塞,此时就要我们进数据库去清理大量造成堵塞的select的线程了,而造成堵塞有一个很明显的现象会有很多的select卡在哪里,我们可以用 mysql> show full processlist; 的方式查看当前是否有很多的select的线程在,如果非常多,并且很长一段时间没有查询结束就需要去kill掉这些线程,在非常多的select下这个是一个非常缓

IOS开发—NSTimer

创建timer对象的三种方法 一.这两个类方法创建一个timer并把它指定到一个默认的runloop模式中 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(i

iOS:三种常见计时器(NSTimer、CADisplayLink、dispatch_source_t)的使用

一.介绍 在iOS中,计时器是比较常用的,用于统计累加数据或者倒计时等,例如手机号获取验证码.计时器大概有那么三种,分别是:NSTimer.CADisplayLink.dispatch_source_t 二.使用 @property (strong,nonatomic)NSTimer *timer; @property (strong,nonatomic)CADisplayLink *displaylinkTimer; @property (strong,nonatomic)dispatch_s

bzoj 3575: [Hnoi2014]道路堵塞

Description A 国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所有从城市1到城市N的路径中最短的.不幸的是,因为从城市1到城市N旅行的人越来越多,这条由交通部指定的路径经常发生堵塞. 现在A国想知道,这条路径中的任意一条道路无法通行时,由城市1到N的最短路径长度是多少. Input 输入文件第一行是三个用空格分开的正整数N.M和L,分别表示城市数目.单向道路数目

NSRunLoop && NSTimer

新的一年的开始,希望大家一切越来越好,越来越开心快乐!!! 定时器及运行循环 NSRunLoop是iOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠. 通过所有的“消息”都被添加到了NSRunLoop中去,而在这里这些消息并分为“input source”和“Timer source” 并在循环中检查是不是有事件需要发生,如果需要那么就调用相

NSTimer类的使用

创建一个 Timer + scheduledTimerWithTimeInterval: invocation: repeats: + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti   invocation:(NSInvocation *)invocation   repeats:(BOOL)yesOrNo; + scheduledTimerWithTimeInterval: target: selector: user

iOS开发——实用技术OC篇&NSTimer使用注意点及总结

NSTimer使用注意点及总结 总结以下在NSTimer的使用中遇到的一些问题: 1. 不要在dealloc函数中停止并释放NSTimer 如果这样做,会导致对象永远无法调用dealloc函数,也就是会造成内存泄漏. 一个比较合理的解释是NSTimer的回调方法具有retain属性,所以不停止它的情况下被引用对象的retainCount无法降为0,导致内存泄漏的死循环 2.因为要实现类似视频软件里面,UIScrollview定时循环滑动,用到了NSTimer类.在特定时事件情况下需要暂停,和重新

iOS容易造成循环引用的三种场景NSTimer以及对应的使用方法(一)

NSTimer A timer provides a way to perform a delayed action or a periodic action. The timer waits until a certain time interval has elapsed and then fires, sending a specified message to a specified object(timer就是一个能在从现在开始的未来的某一个时刻又或者周期性的执行我们指定的方法的对象)