首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当uiscrollview事件发生时,NSTimer不会被触发

当UIScrollView事件发生时,NSTimer不会被触发的原因是因为UIScrollView的滚动事件会将主线程的RunLoop切换到UITrackingRunLoopMode模式下,而默认情况下NSTimer是在NSDefaultRunLoopMode模式下运行的。由于RunLoop只能在一种模式下运行,所以当UIScrollView滚动时,NSTimer就无法被触发。

解决这个问题的方法是将NSTimer添加到NSRunLoopCommonModes模式中,这样即使UIScrollView滚动,NSTimer仍然能够被触发。可以通过以下代码实现:

代码语言:swift
复制
// 创建一个NSTimer对象
let timer = Timer(timeInterval: 1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)

// 将NSTimer对象添加到NSRunLoopCommonModes模式中
RunLoop.current.add(timer, forMode: .commonModes)

// NSTimer触发时执行的方法
@objc func timerFired() {
    // 处理定时任务
}

在上述代码中,将NSTimer对象添加到NSRunLoopCommonModes模式中,这样无论UIScrollView处于哪种模式下,NSTimer都能够被触发。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深入理解RunLoop及在开发中的应用

一.RunLoop定义 RunLoop:运行循环,简单的说就是处理线程事件和管理线程的一种机制。子线程的事件结束,runloop将会自动休眠,app主线程中的runloop处于一直唤醒状态。...当用户触发事件,runloop通知线程执行事件内容。 二.线程与RunLoop的关系 1.每条线程都有唯一的一个与之对应的RunLoop对象,没有线程,也就没有RunLoop存在的必要。...Source0:非基于端口port,例如触摸,滚动,selector选择器等用户触发事件;(只包含了一个回调函数,它并不能主动触发事件) Source1:基于端口port,一些系统事件; (包含了一个...其加入到 RunLoop ,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。...解决NSTimerUIScrollView滑动停止工作的问题 默认情况下,在滚动 tableView、UIScrollView 的时候,NSTimer会停止工作,这是因为在滚动,RunLoop

1.3K20

双击事件(dblclick),触发鼠标按下(mousedown) 动作事件

在一个dom节点的事件绑定中,如果同时绑定了dblclick和mousedown那么想要执行双击事件(dblclick)能就会触发两次mousedown事件。...因此,触发顺序是,mousedown首先触发,mouseup接着触发,click最后触发。 dblclick事件则会在mousedown、mouseup、click之后触发。...mouseover事件和mouseenter事件,都是鼠标进入一个节点触发。...在单击的时候(也就是鼠标按下的时候)不会执行双击,但是双击的时候会执行两次单击再执行双击事件。 解决的思路:要想双击执行单击事件,就使用定时器清除掉两个单击事件,留下一个双击事件。...第一次单击任务执行了,是被定时器延时,然后第二次点击的时候给清除了。那么第二次点击事件呢? 在两次单击之后,会立马执行一个双击事件,双击事件的一开头就把这个第二次点击事件给清除了。

55620

UIScrollView

上面放置任何子视图的时候,当你在子视图上移动的时候,UIScrollView会给子视图发送touchCancel消息,而如果该属性设置为NO,ScollView本身处理这个消息,全部交给子视图处理...@property(nonatomic) BOOL canCancelContentTouches; //28.自定义默认行为,手指触摸在显示的内容由子类重写 - (BOOL)touchesShouldBegin...滚动动画停止执行代码改变触发,也就是setContentOffset改变的时候 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *...: 文字改变事件(UITextField) 通过delegate 只有拥有delegate属性的控件,才有这个功能 NSTimer的使用 开启定时器 @property (nonatomic, weak...) NSTimer *timer; // 返回一个自动开始执行任务的定时器 self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target

1.8K60

iOS多线程——你要知道的RunLoop都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

,即滑动UIScrollView才会执行的模式,此时,不在该模式内的Source/Timer/Observer都不会得到执行,它仅仅专注于滑动产生的各种事件,通过这样的方式就可以保证用户在滑动页面的流畅性..., World222"); }]; } 上面的栗子创建了两个NSTimer,这两个定时器执行效果相同,但如果页面中有一个UIScrollView或其子类的对象在滑动NSTimer就不会再有任何输出...,停下滑动又会有输出,因为上述代码创建的两个NSTimer都加入到了RunLoop对象的NSDefaultRunLoopMode中,在滑动RunLoop会切换到UITrackingRunLoopMode...如果加在其他模式下,模式切换就不会再执行NSTimer的回调方法了,所以,在使用时需要根据情况选择不同的定时器以满足项目需求。...执行source0事件 如果有source1(基于端口的)事件则立即执行跳转到第九步 通知监听器RunLoop即将进入休眠状态 将线程休眠,直到以下事件发生会被唤醒: 有source1事件到达

1.5K80

iOS多线程:『RunLoop』详尽总结RunLoop

2.3 CFRunLoopTimerRef CFRunLoopTimerRef是定时源(RunLoop模型图中提到过),理解为基于时间的触发器,基本上就是NSTimer(哈哈,这个理解就简单了吧)。...但是当我们拖动Text View滚动,我们发现:run方法不打印了,也就是说NSTimer工作了。而当我们松开鼠标的时候,NSTimer就又开始正常工作了。...通知观察者即将要开始的定时器 通知观察者任何即将启动的非基于端口的源 启动任何准备好的非基于端口的源 如果基于端口的源准备好并处于等待状态,立即启动;并进入步骤9 通知观察者线程进入休眠状态 将线程置于休眠知道任一下面的事件发生...4.2 ImageView推迟显示 有时候,我们会遇到这种情况: 界面中含有UITableView,而且每个UITableViewCell里边都有图片。...监听UIScrollView的滚动 因为UITableView继承自UIScrollView,所以我们可以通过监听UIScrollView的滚动,实现UIScrollView相关delegate即可。

2.1K50

iOS_Memory Leak 内存泄露治理

检测方法是用 Mark Generation 的方式,每次点击 Mark Generation ,Allocations 会生成当前 App 的内存快照,而且 Allocations 会记录从上回内存快照到这次内存快照这个时间段内...---- 3、Analyze 静态分析入口: 分析案例: 缺陷:只能检查编译的内存泄漏,并不能检测到所有的内存泄漏,如:发生在运行时,或需要用户操作产生的泄露。...---- 8、FBRetainCycleDetector Facebook 开源的 循环引用检测 工具 FBRetainCycleDetector 确认或怀疑一个对象是否泄露,都可以使用该工具查找循环引用链...= nil; } iOS10之前的方法,需要传入target(一般我们用self)作为代理,执行需要定时触发的方法。...开发者直接传入 self ,就导致了 self 无法被释放,进而在 dealloc 里释放 NSTimer 的代码也不会执行,从而导致了内存泄露:RunLoop -> NSTimer -> self

61520

微信团队分享:详解iOS版微信视频号直播中因帧率异常导致的功耗问题

基于 「CADisplayLink」 触发的动画,和基于 NSTimer 触发类似,只不过这个 timer 源是和渲染保持一致的,能够做到更流畅更贴合。...整体过程大概如下: 1)App 处理事件,例如 touch 事件或者 displaylink timer 事件; 2)App 完成视图的 layout、图像 decode 等操作,并触发 CA::Transaction...它在 iOS 6 中引入,旨在减轻 Springboard 的一些职责,主要是事件处理的职责。它主要负责把 touch 事件分发到 app 进程以及处理 app 进程触发的动画和UI更新操作。...,这就回导致 FPS 发生变化,也最终影响了 app 的性能占用。...但是在我们直播场景中,一共有如下几种场景的动画提交: 1)UIView block 动画; 2)UIScrollView scroll 动画; 3)NSTimer 动画; 4)CAAnimation。

38900

自欺欺人的使用 NSTimer 销毁

自欺欺人的使用 NSTimer 销毁 Demo地址 1.NSTimer是要加到runloop中才会起作用。...:@selector(timerAction:) userInfo:nil repeats:YES]; 第一种缺陷如果当前线程就是主线程,也就是UI线程,某些UI事件,比如UIScrollView的拖动操作...,会将Run Loop切换成NSEventTrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode模式中注册的事件是不会被执行的。...自欺欺人的写法,永远都不会执行到,除非你在外部手动invalidate这个timer [self.timer invalidate]; } 当我们在控制器中创建timer且tager设为self。...会发生 timer 添加到 Runloop 的时候,且会被 Runloop 强引用, Note in particular that run loops maintain strong references

46760

自欺欺人的使用 NSTimer 销毁

自欺欺人的使用 NSTimer 销毁 Demo地址 1.NSTimer是要加到runloop中才会起作用。...:@selector(timerAction:) userInfo:nil repeats:YES]; 第一种缺陷如果当前线程就是主线程,也就是UI线程,某些UI事件,比如UIScrollView的拖动操作...,会将Run Loop切换成NSEventTrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode模式中注册的事件是不会被执行的。...自欺欺人的写法,永远都不会执行到,除非你在外部手动invalidate这个timer [self.timer invalidate]; } 当我们在控制器中创建timer且tager设为self。...会发生 timer 添加到 Runloop 的时候,且会被 Runloop 强引用, Note in particular that run loops maintain strong references

1.9K70

暗影骑士擎bios详解_runloop原理和机制

kCFRunLoopDefaultMode) • NSRunLoopCommonModes(kCFRunLoopCommonModes) CFRunLoopTimerRef CFRunLoopTimerRef是基于时间的触发器...NSRunLoop *runloop = [NSRunLoop currentRunLoop]; autorelease 对象在什么情况下会被释放?...但是非主线程通常来说就是为了执行某一任务的,执行完毕就需要归还资源,因此默认是运行RunLoop的。NSRunLoop提供了一个添加NSTimer的方法,这个方法是在应用正常状态下会回调。...为什么 UIScrollView 的滚动会导致 NSTimer 失效?...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

64110

iOS-RunLoop充满灵性的死循环

RunLoop 的销毁发生在线程结束。 六....和UITrackingRunLoopMode用,并不是一种真正的Mode Mode间的切换 我们平时在开发中一定遇到过,当我们使用NSTimer每一段时间执行一些事情滑动UIScrollViewNSTimer...CFRunLoopSourceRef事件源(输入源) Source分为两种 Source0:非基于Port的 用于用户主动触发事件(点击button 或点击屏幕) Source1:基于Port的...RunLoop内部有一个自动释放池,RunLoop开启,就会自动创建一个自动释放池,RunLoop在休息之前会释放掉自动释放池的东西,然后重新创建一个新的空的自动释放池,RunLoop被唤醒重新开始跑圈...,Timer,Source等新的事件就会放到新的自动释放池中,RunLoop退出的时候也会被释放。

1.6K80

NSRunLoop-iOS中隐藏的大杀器

事件发生RunLoop会唤醒线程来处理事件。 - 如果把一般线程的执行看作是一条直线,有起点终点, 而runloop就是把这个线连接成圆圈,一直在跑圈,除非切断否则一直线程一直在运行。...节省CPU资源,提高程序性能:该做事做事,该休息休息 RunLoop什么情况下使用 - 线程中使用ports 或 input sources 和其他线程通信 - 在线程中使用timers // 如果启动...在你运行一个Run Loop,你会为它显示或隐式地指定一个mode 这之后,在这个Run Loop中,只有与这个mode关联的事件源才会被监听并被允许分发事件,同理,也只有与这个mode关联的observer...timer sources:用于分发同步事件,通常这些事件发生在特定时间或者重复的时间间隔上,比如:[NSTimer scheduledTimerWithTimeInterval:target:selector...Corefunction向线程添加runloop observers来监听事件,意在监听事件发生来做处理。

1.1K10
领券