From a12b7945bf5bc500819453601858e44d82cd3c1a Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 29 Nov 2022 17:22:58 +0800 Subject: [PATCH] SwiftTimerQueue add jobs to workQueue, do job every interval --- README.md | 10 ++++ Sources/SwiftTimer.swift | 53 +++++++++++++++++++ SwiftTimer iOSTests/SwiftTimer_iOSTests.swift | 21 ++++++++ 3 files changed, 84 insertions(+) diff --git a/README.md b/README.md index 742feb0..82d2695 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,16 @@ timer = SwiftCountDownTimer(interval: .fromSeconds(0.1), times: 10) { timer , le timer.start() ~~~ +### timer queue + +~~~swift +timer = SwiftTimerQueue.init(interval: . seconds(1)) +for i in 0..<50{ + timer.addQueue { + label.text = "\(i)" + } +} +~~~ ## Installation diff --git a/Sources/SwiftTimer.swift b/Sources/SwiftTimer.swift index 850ba3c..6daa779 100644 --- a/Sources/SwiftTimer.swift +++ b/Sources/SwiftTimer.swift @@ -190,3 +190,56 @@ public extension DispatchTimeInterval { return .milliseconds(Int(seconds * 1000)) } } + + +public class SwiftTimerQueue { + + private let internalTimer: SwiftTimer + private var workQueue:[DispatchWorkItem] + + + ///The Handler will be called after interval you specified + ///Calling again in the interval cancels the previous call + public init(interval: DispatchTimeInterval, queue: DispatchQueue = .main) { + self.workQueue = [] + self.internalTimer = SwiftTimer.init(interval: interval, repeats: true, queue: queue) { _ in + } + self.internalTimer.rescheduleHandler {[weak self] swiftTimer in + if let strongSelf = self,let command = strongSelf.workQueue.first,!command.isCancelled { + queue.async(execute: command) + } + } + } + + func addQueue(_ handler: @escaping () -> Void ) { + let item = DispatchWorkItem {[weak self] in + guard let weak = self else{ + return + } + if weak.workQueue.count > 0{ + weak.workQueue.removeFirst() + } + handler(); + }; + workQueue.append(item) + } + + func clean() { + for item in workQueue{ + item.cancel() + } + workQueue = [] + } + + func flowCount()->Int { + return workQueue.count + } + + public func start() { + self.internalTimer.start() + } + + public func suspend() { + self.internalTimer.suspend() + } +} diff --git a/SwiftTimer iOSTests/SwiftTimer_iOSTests.swift b/SwiftTimer iOSTests/SwiftTimer_iOSTests.swift index 7800e0e..5cfae0a 100644 --- a/SwiftTimer iOSTests/SwiftTimer_iOSTests.swift +++ b/SwiftTimer iOSTests/SwiftTimer_iOSTests.swift @@ -165,4 +165,25 @@ class SwiftTimer_iOSTests: XCTestCase { self.waitForExpectations(timeout: 1.01, handler: nil) } + + func testTimerQueue() { + + let expectation = self.expectation(description: "test timer queue") + + let label = UILabel() + + let timer = SwiftTimerQueue.init(interval: .seconds(1)) + for i in 0..<50{ + timer.addQueue { + label.text = "\(i)" + } + } + timer.addQueue { + expectation.fulfill() + } + timer.start() + + self.waitForExpectations(timeout: 51, handler: nil) + + } }