IOS开发中滑动页面时NSTimer停止的问题

我们在做倒计时的时候,发现当你手指按着屏幕不放,拖动tableView滑动的时候,写在cell上得倒计时停止倒计时,松开继续倒计时。研究发现就是拖动tableView滑动时,NSTimer停止了。

这其实就是runloop的mode在做怪。 runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发 的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]我们可以得到一个当前线程下面对应的runloop对象,不过我们需要注意的是不同的runloop之间消息的通知方式。

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

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

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

一个简单例子,创建NSTimer进行倒计时时,修改model:

- (id)initWithTimeout:(NSInteger)total {
    if (self = [self init]) {
        self.counter = total;
        if (total > 0) {
            self.countdown = YES;
            // Notice: scheduledTimerWithTimeInterval adds the timer to the current thread's run loop
            timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                     target:self
                                                   selector:@selector(countingDown:)
                                                   userInfo:nil
                                                    repeats:YES];
            
            [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
            return self;
        }
    }
    
    return self;
}

说到这里,在http异步通信的模块中也有可能碰到这样的问题,就是在向服务器异步获取图片数据通知主线程刷新tableView中的图片时,在 tableView滚动没有停止或用户手指停留在屏幕上的时候,图片一直不会出来,可能背后也是这个runloop的mode在做怪。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

UWP 开发中,需要知道的1000个问题

真的有那么多问题?其实我就想记 ListViewItem 的问题,我自己都不记得在什么时候写如何设置他不压缩。

4422
来自专栏hbbliyong

WPF中播放声音媒体文件

这段时间我们小组要给部门的Annual Meeting準备一个WPF的抽奖程序,为了增加程序的有趣性,我们在程序中需要播放背景音乐等。由於对之前从未使用过WPF...

4366
来自专栏MasiMaro 的技术博文

程序隐藏到任务栏的实现

我们在使用软件的时候,有的软件允许最小化到任务栏,然后双击任务栏的图标时又会显示出来,这篇文章主要说明如何实现这种功能; 实现这种功能主要分为两步,一是将程...

1311
来自专栏walterlv - 吕毅的博客

使 WPF 支持触摸板的横向滚动

发布于 2017-11-23 13:25 更新于 2018-08...

772
来自专栏菩提树下的杨过

WPF:自动执行"机器人"程序若干注意事项

企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据、定时对历史数据进行清理、定时向ftp上传业...

1998
来自专栏walterlv - 吕毅的博客

让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

发布于 2018-08-05 06:24 更新于 2018-09...

931
来自专栏DannyHoo的专栏

iOS开发中创建定时器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

2022
来自专栏BY的专栏

iOS定时器,你真的会使用吗?前言正文结语

5055
来自专栏跟着阿笨一起玩NET

C#自定义开关按钮控件--附带第一个私活项目截图

进入智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操...

1761
来自专栏林德熙的博客

win10 17025 触摸bug

This article is written in both English and Chinese. 本文使用中文和英文两个版本。 在 win10 的 1...

761

扫码关注云+社区