Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
// DispatchQueueExtensions.swift - Copyright 2020 SwifterSwift
#if canImport(Dispatch)
import Dispatch
// MARK: - Properties
public extension DispatchQueue {
/// SwifterSwift: A Boolean value indicating whether the current dispatch queue is the main queue.
static var isMainQueue: Bool {
enum Static {
static var key: DispatchSpecificKey<Void> = {
let key = DispatchSpecificKey<Void>()
DispatchQueue.main.setSpecific(key: key, value: ())
return key
}()
}
return DispatchQueue.getSpecific(key: Static.key) != nil
}
}
// MARK: - Methods
public extension DispatchQueue {
/// SwifterSwift: Returns a Boolean value indicating whether the current dispatch queue is the specified queue.
///
/// - Parameter queue: The queue to compare against.
/// - Returns: `true` if the current queue is the specified queue, otherwise `false`.
static func isCurrent(_ queue: DispatchQueue) -> Bool {
let key = DispatchSpecificKey<Void>()
queue.setSpecific(key: key, value: ())
defer { queue.setSpecific(key: key, value: nil) }
return DispatchQueue.getSpecific(key: key) != nil
}
/// SwifterSwift: Runs passed closure asynchronous after certain time interval.
///
/// - Parameters:
/// - delay: The time interval after which the closure will run.
/// - qos: Quality of service at which the work item should be executed.
/// - flags: Flags that control the execution environment of the work item.
/// - work: The closure to run after certain time interval.
func asyncAfter(delay: Double,
qos: DispatchQoS = .unspecified,
flags: DispatchWorkItemFlags = [],
execute work: @escaping () -> Void) {
asyncAfter(deadline: .now() + delay, qos: qos, flags: flags, execute: work)
}
func debounce(delay: Double, action: @escaping () -> Void) -> () -> Void {
// http://stackoverflow.com/questions/27116684/how-can-i-debounce-a-method-call
var lastFireTime = DispatchTime.now()
let deadline = { lastFireTime + delay }
return {
self.asyncAfter(deadline: deadline()) {
let now = DispatchTime.now()
if now >= deadline() {
lastFireTime = now
action()
}
}
}
}
}
#endif