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 条评论
登录 后参与评论

相关文章

来自专栏MasiMaro 的技术博文

程序隐藏到任务栏的实现

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

16710
来自专栏lgp20151222

debug的一些按钮意义

9930
来自专栏DannyHoo的专栏

iOS开发中创建定时器

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

32320
来自专栏林德熙的博客

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

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

59020
来自专栏BY的专栏

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

60650
来自专栏葡萄城控件技术团队

如何将GridViewEX升级到UWP(Universal Windows Platform)平台

引言 上一篇文章中,我们主要讲解了如何在保证GridView控件的用户体验基础上,扩展GridView生成GridViewEx控件,增加动态添加新分组功能等,本...

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

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

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

21980
来自专栏蜉蝣禅修之道

sencha touch结合phonegap开发android下的文件浏览器

18350
来自专栏Hongten

python开发_tkinter_单选按钮

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

30220
来自专栏林德熙的博客

WPF 渲染原理

在 WPF 最主要的就是渲染,因为 WPF 是一个界面框架。想用一篇博客就能告诉大家完整的 WPF 渲染原理是不可能的。本文告诉大家 WPF 从开发者告诉如何画...

20520

扫码关注云+社区

领取腾讯云代金券