LNEventDeliver.swift 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // LNEventDeliver.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/6.
  6. //
  7. import Foundation
  8. protocol LNAppMainEvent {
  9. func onAppLaunchFinished()
  10. func onAppLanguageChanged(newLanguage: LNAppLanguage)
  11. func onAppStateChanged(foreground: Bool)
  12. }
  13. extension LNAppMainEvent {
  14. func onAppLaunchFinished() {}
  15. func onAppLanguageChanged(newLanguage: LNAppLanguage) {}
  16. func onAppStateChanged(foreground: Bool) { }
  17. }
  18. class LNEventDeliver {
  19. private static let lock = NSLock()
  20. private static let observers = NSHashTable<AnyObject>.weakObjects()
  21. static func addObserver(_ observer: AnyObject) {
  22. lock.lock()
  23. guard !observers.contains(observer) else {
  24. lock.unlock()
  25. return
  26. }
  27. observers.add(observer)
  28. lock.unlock()
  29. }
  30. static func removeObserver(_ observer: AnyObject) {
  31. lock.lock()
  32. guard observers.contains(observer) else {
  33. lock.unlock()
  34. return
  35. }
  36. observers.remove(observer)
  37. lock.unlock()
  38. }
  39. static func notifyEvent(_ queue: DispatchQueue = .main,
  40. _ event: @escaping (AnyObject) -> Void, ) {
  41. lock.lock()
  42. let allObservers = observers.allObjects
  43. lock.unlock()
  44. if queue == .main, Thread.isMainThread {
  45. allObservers.forEach { event($0) }
  46. } else {
  47. queue.async {
  48. allObservers.forEach { event($0) }
  49. }
  50. }
  51. }
  52. }
  53. // 主要事件的通知方法
  54. extension LNEventDeliver {
  55. static func notifyAppLaunchFinished() {
  56. notifyEvent { ($0 as? LNAppMainEvent)?.onAppLaunchFinished() }
  57. }
  58. }