节流
import Foundation
public class Throttler {
private let queue: DispatchQueue = DispatchQueue.global(qos: .background)
private var job: DispatchWorkItem = DispatchWorkItem(block: {})
private var preiousRun: Date = Date.distantPast
private var maxInterval: Int
init(seconds: Int) {
self.maxInterval = seconds
}
func throttle(block: @escaping ()->()) {
job.cancel()
job = DispatchWorkItem(){
[weak self] in
self?.preiousRun = Date()
block()
}
let delay = Date.second(from: preiousRun) > maxInterval ? 0: maxInterval
queue.asyncAfter(deadline: .now() + Double(delay), execute: job)
}
}
private extension Date {
static func second(from referenceDate: Date) -> Int {
return Int(Date().timeIntervalSince(referenceDate).rounded())
}
}
自定义操作符
// MARK: - 自定义操作符
public extension SafeArray {
static func +=(left: inout SafeArray, right: Element) {
left.append(right)
}
static func +=(left: inout SafeArray, right: [Element]) {
left.append(right)
}
}