不被干扰的NSTimer

当timer被添加在cell上时,滑动cell会造成timer失效,因为cell的滑动(UITrackingRunLoopMode)屏蔽了NSDefaultRunLoopMode。

可以把timer移到其他mode中,用scheduledTimerWithTimeInterval创建时会默认使用NSDefaultRunLoopMode,下面用NSTimer的类方法timerWithTimeInterval创建,并且手动指定mode:

NSTimer *timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
    cellLabel.text = [NSString stringWithFormat:@"%ld",cellLabel.text.integerValue + 1];
}];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[timer fire];

这样在滑动cell的时候timer是正常运转的

NSDefaultRunLoopMode、UITrackingRunLoopMode才是真正存在的模式,
NSRunLoopCommonModes并不是一个真的模式,它只是一个标记,timer能在_commonModes数组中存放的模式下工作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSTimer是iOS最常用的定时器工具之一,在使用的时候常常会遇到各种各样的问题,最常见的是内存泄漏,通常我们使...
    bomo阅读 1,267评论 0 7
  • 说明iOS中的RunLoop使用场景1.保持线程的存活,而不是线性的执行完任务就退出了<1>不开启RunLoop的...
    野生塔塔酱阅读 6,832评论 15 109
  • 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存...
    小枫123阅读 928评论 0 1
  • 1. 什么是NSTimer   官方的解释“A timer provides a way to perform a...
    Timir阅读 830评论 0 3
  • 再一次面试中被问到nstimer的争取使用方法,原理,我当时就说了[_timer invalidate],time...
    iOS开发小平哥阅读 4,108评论 1 13