Swift:GCD定时器的实现

话不多说,直接上代码:

    static let share = GCDTimerTool()
    
    lazy var timerContainer = [String : DispatchSourceTimer]()
    
    
    /// 创建一个名字为name的定时
    /// - Parameters:
    ///  - name: 定时器的名字
    ///  - timeInterval: 时间间隔(传1就是每1s调用一次)
    ///  - queue: 线程
    ///  - repeats: 是否重复
    ///  - action: 执行的操作
    func scheduledDispatchTimer(withName name: String?, timeInterval: Double, queue:DispatchQueue, repeats:Bool, action: @escaping ActionBlock ) {
        if name == nil {
            return
        }
        var timer = timerContainer[name!]
        if timer ==nil {
            timer = DispatchSource.makeTimerSource(flags: [], queue: queue)
            timer?.resume()
            timerContainer[name!] = timer
        }
        timer?.schedule(deadline: .now(), repeating: timeInterval, leeway: .milliseconds(100))
        timer?.setEventHandler(handler: { [weak self] in
            action()
            if repeats==false {
                self?.destoryTimer(withName: name!)
            }
        })
        
    }
    
    
    /// 销毁名字为name的定时器
    /// - Parameter name: 定时器的名字
    func destoryTimer(withName name: String?) {
        let timer = timerContainer[name!]
        if timer == nil {
            return
        }
        timerContainer.removeValue(forKey: name!)
        timer?.cancel()
    }
    
    
    /// 检测是否已经存在名字为name的定时器
    ///
    /// - Parameter name: 定时器的名字
    /// - Returns: 返回bool值
    func isExistTimer(withName name:String?) -> Bool {
        if timerContainer[name!] != nil {
            return true
        }
        return false
    }

可以直接传建一个Timer的文件,如GCDTimer.siwft,这样使用就非常简单了,简单粗暴。

GCDTimer.share.scheduledDispatchTimer(withName: networkTimerName, timeInterval: 10, queue: DispatchQueue.main, repeats: true) {[weak self] in
    guard let `self` = self else {return}
    self.loadData()
}

注意:定时器使用完毕后不要忘记销毁,使用destoryTimer方法即可。

你可能感兴趣的:(Swift:GCD定时器的实现)