关于 NSTimer 不执行的问题

今日写 Mac 平台 dylib 代码的时候, 发现一个问题. 当 NSTimer 在子线程中的时候, 是无法正常执行的.

错误代码如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeScheduled:) userInfo:nil repeats:NO];
        
    [NSRunLoop.currentRunLoop addTimer:timer forMode:NSDefaultRunLoopMode];
});

这是因为主线程中有一个 Runloop, 而子线程中一般没有 Runloop 直到你为其创建一个. 因此, 一般情况下,只有主线程才能够正确的执行 NSTimer, 而子线程则不会正确执行.

现将代码更正为:

dispatch_async(dispatch_get_main_queue(), ^{
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeScheduled:) userInfo:nil repeats:NO];
        
    [NSRunLoop.currentRunLoop addTimer:timer forMode:NSDefaultRunLoopMode];
});

这时候, Timer 就可以正确的跑起来了.

参考资料

NSTimer not firing the selector

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

推荐阅读更多精彩内容

  • 每每听到套路,大家都会对她嗤之以鼻,好像这个时代这个玩意多么令人可憎,可是仔细想想,她却又没有那么狰狞,是令你认识...
    更好时代阅读 577评论 0 1
  • 是的 你比昨天老了一点 行走的时候 就有一丁点的缓缓 我也一样 有些头发不见了 不知去到哪里 不过风还在吹 吹到同...
    阿塔尼斯阅读 150评论 0 0
  • 现在戒烟是一个负担,戒烟的日更也是一个负担,哎,我又自虐倾向吗? 现在的过程好像进入了一个坏的循环,抽烟——>焦虑...
    诚实的果果阅读 213评论 0 1
  • 日记星球269号星宝宝,我正在参加日记星球第十二期蜕变之旅,这是我的第0378篇原创日记。我相信日积月累的力量! ...
    cf302fb8f796阅读 688评论 0 0
  • 做领导就是一份责任,要为公司负责、为下属负责、我自己负责。 首先,摘选《阿里巴巴人力资源管理》里面有一句话:团队的...
    郑剑丰阅读 2,681评论 0 3