SwiftNotificationCenter.swift 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import Foundation
  2. public enum SwiftNotificationCenter {
  3. fileprivate static var observersDic = [String: Any]()
  4. fileprivate static let notificationQueue = DispatchQueue(
  5. label: "com.swift.notification.center.dispatch.queue",
  6. attributes: .concurrent
  7. )
  8. public static func register<T>(_ protocolType: T.Type, observer: T) {
  9. let key = "\(protocolType)"
  10. safeSet(key: key, object: observer as AnyObject)
  11. }
  12. public static func unregister<T>(_ protocolType: T.Type, observer: T) {
  13. let key = "\(protocolType)"
  14. safeRemove(key: key, object: observer as AnyObject)
  15. }
  16. /// Remove all observers which comform to the protocol
  17. public static func unregister<T>(_ protocolType: T.Type) {
  18. let key = "\(protocolType)"
  19. safeRemove(key: key)
  20. }
  21. public static func notify<T>(_ protocolType: T.Type, block: (T) -> Void) {
  22. let key = "\(protocolType)"
  23. guard let objectSet = safeGetObjectSet(key: key) else {
  24. return
  25. }
  26. for observer in objectSet {
  27. if let observer = observer as? T {
  28. block(observer)
  29. }
  30. }
  31. }
  32. }
  33. private extension SwiftNotificationCenter {
  34. static func safeSet(key: String, object: AnyObject) {
  35. notificationQueue.async(flags: .barrier) {
  36. if var set = observersDic[key] as? WeakObjectSet<AnyObject> {
  37. set.add(object)
  38. observersDic[key] = set
  39. } else {
  40. observersDic[key] = WeakObjectSet(object)
  41. }
  42. }
  43. }
  44. static func safeRemove(key: String, object: AnyObject) {
  45. notificationQueue.async(flags: .barrier) {
  46. if var set = observersDic[key] as? WeakObjectSet<AnyObject> {
  47. set.remove(object)
  48. observersDic[key] = set
  49. }
  50. }
  51. }
  52. static func safeRemove(key: String) {
  53. notificationQueue.async(flags: .barrier) {
  54. observersDic.removeValue(forKey: key)
  55. }
  56. }
  57. static func safeGetObjectSet(key: String) -> WeakObjectSet<AnyObject>? {
  58. var objectSet: WeakObjectSet<AnyObject>?
  59. notificationQueue.sync {
  60. objectSet = observersDic[key] as? WeakObjectSet<AnyObject>
  61. }
  62. return objectSet
  63. }
  64. }