DispatchSourceTimer 的setEventHandler函数不执行

前提:sourceTimer已经设置为全局变量,sourceTimer在创建之前也调用了cancel(),创建之后调用过resume()。

func startTimer() {

        self.sourceTimer?.cancel()
        let queue = DispatchQueue(label: "\(AppDomain).verticalCycle.timer", attributes: .concurrent)
        sourceTimer = DispatchSource.makeTimerSource(flags: .strict, queue: queue)
        sourceTimer?.schedule(deadline: .now(), repeating: duration, leeway: .milliseconds(100))
        sourceTimer?.setEventHandler(handler: {
            DispatchQueue.main.async {
               
            }
            
        })
        sourceTimer?.resume()
    }

暂时的解决办法:调用定时器的创建开启时给0.1S的延时

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

推荐阅读更多精彩内容

  • 一. NSTimer NSTimer的初始化方法有以下几种: 会自动启动, 并加入* MainRunloop*的*...
    codeshow阅读 537评论 0 0
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 1,463评论 1 27
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,316评论 1 23
  • 1. 前言 上一篇文章《Android Animation运行原理详解》介绍了插间动画的原理,而Android3....
    SparkInLee阅读 13,790评论 5 52
  • iOS 面试题总结(一) 101. 修改下面的代码: typedef enum{ UserSex_Man,User...
    AlaricMurray阅读 1,744评论 0 6