博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RunLoop的应用场景---关于滑动tableView的时候NSTimer 暂停的问题
阅读量:6979 次
发布时间:2019-06-27

本文共 1559 字,大约阅读时间需要 5 分钟。

1.我们经常会在应用中看到tableView 的header 上是一个横向ScrollView,一般我们使用NSTimer,每隔几秒切换一张图片。可是当我们滑动tableView的时候,顶部的scollView并不会切换图片,这可怎么办呢? 

2.界面上除了有tableView,还有显示倒计时的Label,当我们在滑动tableView时,倒计时就停止了,这又该怎么办呢?
 

场景中的代码实现

 
我们的定时器Timer是怎么写的呢? 
一般的做法是,在
主线程(可能是某控制器的viewDidLoad方法)中,创建Timer。 
可能会有两种写法,但是都有上面的问题,下面先看下Timer的两种写法:
 
// 第一种写法
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[timer fire];
// 第二种写法
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerUpdate) userInfo:nil repeat
 
上面的两种写法其实是等价的。第二种写法,默认也是将timer添加到
NSDefaultRunLoopMode下的,并且会自动fire。
 
然后,我们在滑动tableView的时候timerUpdate方法,并不会调用。 
* 原因是啥呢?* 
原因是当我们滑动scrollView时,主线程的RunLoop 会切换到
UITrackingRunLoopMode这个Mode,执行的也是
UITrackingRunLoopMode下的任务(Mode中的item),而timer 是添加在
NSDefaultRunLoopMode下的,所以timer任务并不会执行,只有当
UITrackingRunLoopMode的任务执行完毕,runloop切换到
NSDefaultRunLoopMode后,才会继续执行timer。
 
 

* 要如何解决这一问题呢?* 

解决方法很简单,我们只需要在添加timer 时,将mode 设置为NSRunLoopCommonModes即可。

- (void)timerTest
{
    // 第一种写法
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    [timer fire];
    // 第二种写法,因为是固定添加到defaultMode中,就不要用了
}
 
 
每一个线程都有一个与之关联的RunLoop,而每一个RunLoop可能会有多个Mode。CPU会在多个线程间切换来执行任务,呈现出多个线程同时执行的效果。执行的任务其实就是RunLoop去各个Mode里执行各个item。因为RunLoop是独立的两个,相互不会影响,所以在子线程添加timer,滑动视图时,timer能正常运行。

转载于:https://www.cnblogs.com/dingzhijie/p/6600012.html

你可能感兴趣的文章
在多线程情况下 局部变量与全局变量 哪个比较安全呢
查看>>
算法评测
查看>>
40款非常酷的国外创意名片设计欣赏
查看>>
RadioGroup单选按钮用法
查看>>
POJ 2773 Happy 2006
查看>>
UBIFS介绍 - MTD网站
查看>>
如何使用ITEXTSHARP将HTML代码字符串写进PDF
查看>>
Oracle SQL CPU占用高
查看>>
mongodb简介与增删该查
查看>>
Maya 2015 中英文切换
查看>>
C语言的字符串分割
查看>>
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
查看>>
BpBinder 转换为 BpCameraService 流程
查看>>
李洪强经典面试题150-设计模式
查看>>
使用maven的profile切换项目各环境的参数
查看>>
XML基础知识
查看>>
如何用C#写一个简单的Login窗口
查看>>
Sharepoint学习笔记—习题系列--70-576习题解析 -(Q141-Q143)
查看>>
sudo配置文件/etc/sudoers格式
查看>>
【Django】Django 如何使用 Django设置的日志?
查看>>