iOS延时执行需要注意的地方

performSelector && NSTimer

使用performSelector系列的方法就是对NSTimer的一种封装,所以NSTimer需要注意的地方,就是performSelector需要注意的地方。

一般可以使用

[self performSelector:@selector(showAlertView) withObject:nil afterDelay:5];

但是要注意这个系列还有一个方法

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;

对NSTimer而言,默认是在NSDefaultRunLoopMode模式下面执行,如果系统切到了其他的mode,比如说滑动一个scrollView,那么timer会等待,直到系统回到NSDefaultRunLoopMode模式下面。如果你的本意是不管怎么样,N秒后触发timer,那么必须要修改timer执行的mode。

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

否则,触发时间会在停止滑动scrollView后的某一个时间,中间的偏差就看你滑了多久的scrollView。

另外需要注意的地方是,一个线程如果没有开启Runloop, NSTimer会不生效。

dispatch_after

dispatch_after就好多了,不依赖于Runloop,但是没法取消。建议不需要取消的时候,都使用dispatch_after。

GCD Dispatch Source Timer

是用GCD timer也是可以的,但是有个问题就是首次触发时间貌似没法直接控制,dispatch_resume之后就立即执行了第一次。

 self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW,5 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);

dispatch_source_set_event_handler(self.timer, ^{
    
    [self showAlertView];
});

dispatch_resume(self.timer);

注意持有dispatch_source_t对象。

应用进入后台

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

推荐阅读更多精彩内容

  • ======================= 前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个...
    i憬铭阅读 923评论 0 4
  • Runloop是iOS和OSX开发中非常基础的一个概念,从概念开始学习。 RunLoop的概念 -般说,一个线程一...
    小猫仔阅读 1,038评论 0 1
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 21,905评论 3 63
  • RunLoop的基本了解 **1 . RunLoop字面的意思 : **运行循环 / 跑圈 **2 . 基本作用 ...
    Mario_ZJ阅读 542评论 1 3
  • 标签(空格分隔): C语言 在C语言中有内存四区的概念,分别是常量区,代码区,堆区,栈区。在常量区中的内存数据是不...
    Sivin阅读 282评论 0 0