Files
OrderScheduling/Pods/DDTimerSwiftKit_Private/DDTimerSwiftKit_Private/Classes/GCDTimer/GCDTimer.swift
2023-09-15 15:15:56 +08:00

160 lines
6.3 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// GCDTimer.swift
// DDTimerSwiftKit_Private
// Created by DDIsFriend on 2023/9/15.
import Foundation
import DDLogKit_Private
public let GCDT = GCDTimer.default
open class GCDTimer {
public static let `default` = GCDTimer()
private var timerSources : [GCDTimerAbstract] = []
public var canceledCompletionHandler:(() -> Void)? //
///
/// - Parameters:
/// - named:
/// - delay:
/// - repeating:
/// - repeatCount:
/// - repeatHandler:
/// - cancelHandler: cancelHandlercompletionHandler
/// - completionHandler: completionHandlercancelHandler
public func addGCDTimer(named timerName:String,delay:DispatchTimeInterval,repeating:DispatchTimeInterval,repeatCount:Int = Int.max,repeatHandler:@escaping (() -> Void),cancelHandler:(() -> Void)? = nil,completionHandler:(() -> Void)? = nil) {
if let _ = timerSources.first(where: { gcdTimerA in
gcdTimerA.timerName == timerName
}) {
DDLog(message: "定时器\'\(timerName)\'重复添加,添加失败")
return
}
let gcdTimerA = GCDTimerAbstract(named: timerName)
gcdTimerA.addGCDTimer(delay: delay, repeating: repeating, repeatCount: repeatCount) {
repeatHandler()
} cancelHandler: {[weak self] timerName in
//
self?.removeGCDTimer(named: timerName)
//
if let cancelHandler {
cancelHandler()
}
//
if let canceledCompletionHandler = self?.canceledCompletionHandler {
canceledCompletionHandler()
}
} completionHandler: {[weak self] timerName in
//
self?.removeGCDTimer(named: timerName)
//
if let completionHandler {
completionHandler()
}
}
timerSources.append(gcdTimerA)
DDLog(message: "定时器\'\(timerName)\'添加成功")
//
logTimerName()
}
/// canceledCompletionHandlercanceledCompletionHandler
/// - Parameters:
/// - timerName:
/// - canceledCompletionHandler:
public func cancelGCDTimer(named timerName:String,canceledCompletionHandler:(() -> Void)? = nil) {
// timerSources
if let gcdTimerA = timerSources.first(where: { gcdTimerA in
gcdTimerA.timerName == timerName
}) {
self.canceledCompletionHandler = canceledCompletionHandler
gcdTimerA.cancelGCDTimer(isCanceledManually: true)
}else{
DDLog(message: "定时器\'\(timerName)\'取消失败,未包含")
}
}
public func containsGCDTimer(named timerName:String) -> Bool {
if let _ = timerSources.first(where: { gcdTimerA in
gcdTimerA.timerName == timerName
}) {
return true
}
return false
}
func removeGCDTimer(named timerName:String) {
//
timerSources.removeAll { gcdTimerA in
gcdTimerA.timerName == timerName
}
DDLog(message: "定时器\'\(timerName)\'移除成功")
//
logTimerName()
}
func logTimerName() {
for gcdTimerA in timerSources {
DDLog(message:("剩余定时器:\'\( gcdTimerA.timerName)\'"))
}
}
}
class GCDTimerAbstract {
private let timerSource = DispatchSource.makeTimerSource(flags: .strict,queue: dispatch_queue_concurrent_t(label: "GCDTimerConcurrentQueue"))
public var timerName : String
public var isCanceledManually : Bool = false //
init(named timerName: String) {
self.timerName = timerName
}
public func addGCDTimer(delay:DispatchTimeInterval,repeating:DispatchTimeInterval,repeatCount:Int,repeatHandler:@escaping (() -> Void),cancelHandler:((String) -> Void)? = nil,completionHandler: ((String) -> Void)? = nil) {
//
var leftRepeatCount = repeatCount
timerSource.setEventHandler(handler: {[weak self] in
//
repeatHandler()
leftRepeatCount-=1
//
if (leftRepeatCount > 0) == false {
self?.cancelGCDTimer(isCanceledManually: false)
}
})
timerSource.setCancelHandler(handler: {[weak self] in
if self?.isCanceledManually == true {
// ,
if let cancelHandler,let timerName = self?.timerName {
cancelHandler(timerName)
}
// ,
}else{
//
if let completionHandler,let timerName = self?.timerName {
completionHandler(timerName)
}
}
})
timerSource.schedule(wallDeadline: DispatchWallTime.now() + delay,repeating: repeating)
timerSource.activate()
}
// cancelHander
public func cancelGCDTimer(isCanceledManually:Bool) {
self.isCanceledManually = isCanceledManually
timerSource.cancel()
}
}