ExtensionDispatchQueue.swift 492 B

123456789101112131415161718192021222324
  1. import Foundation
  2. /*
  3. Credits:
  4. https://github.com/future-challenger/Swift3.0/tree/master/GCD
  5. */
  6. public extension DispatchQueue {
  7. private static var onceTracker = [String]()
  8. /// Execute the given `block` only once during app's lifecycle
  9. typealias Block = () -> Void
  10. public class func once(token: String, block: @escaping Block) {
  11. objc_sync_enter(self);
  12. defer {
  13. objc_sync_exit(self)
  14. }
  15. if onceTracker.contains(token) { return }
  16. onceTracker.append(token)
  17. block()
  18. }
  19. }