iOS中如何使定时器NSTimer不受UIScrollView滑动所影响
2024-10-18 16:49:12
以下是使用 scheduledTimerWithTimeInterval 方法来实现定时器
- (void)addTimer
{
NSTimer scheduledTimerWithTimeInterval:2.0 repeats:YES block:^{
[self nextImage];
}
}
该方法会自动为我们实例化的timer添加到当前线程的RunLoop中,并且默认模式是
NSDefaultRunLoopMode
。但当前线程是主线程时,
当scrollView或其子类进行滚动的时候,UIKIT会自动将当前runLoopMode切换为
UITrackingRunLoopMode
,因为runLoop只能在各种Mode之间切换,同一时间只能存在一个Mode,所以你加在
NSDefaultRunLoopMode
中的计时器当然不会走了。
NSDefaultRunLoopMode
。但当前线程是主线程时,
当scrollView或其子类进行滚动的时候,UIKIT会自动将当前runLoopMode切换为
UITrackingRunLoopMode
,因为runLoop只能在各种Mode之间切换,同一时间只能存在一个Mode,所以你加在
NSDefaultRunLoopMode
中的计时器当然不会走了。
因此,为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,再获取到当前线程的Runloop,然后使用RunLoop的 addTimer:forMode: 方法来把Timer按照指定的模式加入到RunLoop中。
- (void)addTimer
{
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
// 消息循环
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode: NSRunLoopCommonModes];
}
当加入到commonModes中时,实际上系统是找出commonModes代表的所有Mode,如 NSDefaultRunLoopMode 和 UITrackingRunLoopMode ,让后分别将其加入了这些mode中。
最新文章
- iOS开发路线简述
- 在dede:arclist、dede:list等标签中调用附加字段
- tracert-命令小结
- 怎样获取优酷站内视频的MP4格式地址,嵌入到手机页面播放
- WEB安全测试之XSS攻击
- [转载]C#获取本机IPv4地址
- trackr: An AngularJS app with a Java 8 backend – Part III
- Sciter/HTMLayout内存占用评测
- asp.net中webservice与android的json数据交互方式设置
- linux 进程数
- servlet之隐藏域
- lumion室内渲染二6.3
- 【CF932E】Team Work(第二类斯特林数)
- 数据库导入.bacpac 文件创建新实例
- Android Studio添加so文件并打包到APK的lib文件夹中
- 安装node版本管理工具之NVM
- C++基础学习-20120515
- Android Fragment重要函数
- springMVC之增删改查
- 独立服务器远程重装Linux系统
热门文章
- (CS229)监督学习应用和梯度下降
- 关于nodejs中的增删改查
- 【转】not found while looking for property错误
- MySQL连接报错(错误:1130)
- Spark集群和任务执行
- ()C++中的赋值运算符重载函数(operator=)
- 【linux】-Makefile简要知识+一个通用Makefile
- .Net5,C#9 新语法(逻辑和属性模式,记录)
- # Maven:Could not transfer artifact org.springframework:spring-webmvc:pom:。。。(系统找不到文件),从网上clone到本地的项目报红
- tcp输入数据 慢速路径处理 &;&; oob数据 接收 &;&; 数据接收 tcp_data_queue