EngineEventCenter.swift 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //
  2. // EngineEventCenter.swift
  3. // TUIRoomKit
  4. //
  5. // Created by aby on 2023/1/8.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import TUICore
  10. protocol RoomKitUIEventResponder: NSObject {
  11. func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable: Any]?)
  12. }
  13. protocol RoomEngineEventResponder: NSObject {
  14. func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String: Any]?)
  15. }
  16. class TUINotificationAdapter:NSObject ,TUINotificationProtocol {
  17. weak var responder: RoomKitUIEventResponder?
  18. init(responder: RoomKitUIEventResponder? = nil) {
  19. self.responder = responder
  20. }
  21. func onNotifyEvent(_ key: String, subKey: String, object anObject: Any?, param: [AnyHashable : Any]?) {
  22. guard let eventKey = EngineEventCenter.RoomUIEvent(rawValue: subKey) else { return }
  23. responder?.onNotifyUIEvent(key: eventKey, Object: anObject, info: param)
  24. }
  25. deinit {
  26. debugPrint("deinit \(self)")
  27. }
  28. }
  29. class EngineEventCenter: NSObject {
  30. // Weak Ref
  31. typealias WeakArray<T> = [() -> T?]
  32. static let shared = EngineEventCenter()
  33. private var engineObserverMap: [RoomEngineEvent: WeakArray<RoomEngineEventResponder>] = [:]
  34. private var uiEventObserverMap: [RoomUIEvent: [TUINotificationAdapter]] = [:]
  35. private override init() {
  36. super.init()
  37. }
  38. enum RoomEngineEvent: String {
  39. case onKickedOffLine
  40. case onRoomDismissed
  41. case onKickedOutOfRoom
  42. case onUserVideoStateChanged
  43. case onUserAudioStateChanged
  44. case onUserVoiceVolumeChanged
  45. case onUserScreenCaptureStopped
  46. case onRequestReceived
  47. case onSendMessageForUserDisableChanged
  48. case onRemoteUserEnterRoom
  49. case onRemoteUserLeaveRoom
  50. case onSeatListChanged
  51. case onAllUserCameraDisableChanged
  52. case onAllUserMicrophoneDisableChanged
  53. case onKickedOffSeat
  54. case onStatistics
  55. case onDeletedTakeSeatRequest
  56. case onExitedRoom
  57. case onDestroyedRoom
  58. case onStartedRoom
  59. case onJoinedRoom
  60. case onConferenceInfoChanged
  61. case onInitialSelfUserInfo
  62. case onInitialRoomInfo
  63. case onGetUserListFinished
  64. case onUserSigExpired
  65. case onUserInfoChanged
  66. }
  67. enum RoomUIEvent: String {
  68. case TUIRoomKitService
  69. case TUIRoomKitService_RenewUserList
  70. case TUIRoomKitService_SomeoneSharing
  71. case TUIRoomKitService_RenewSeatList
  72. case TUIRoomKitService_UserOnSeatChanged
  73. case TUIRoomKitService_ShowRoomMainView
  74. case TUIRoomKitService_ShowRoomVideoFloatView
  75. case TUIRoomKitService_CurrentUserHasAudioStream
  76. case TUIRoomKitService_CurrentUserHasVideoStream
  77. case TUIRoomKitService_CurrentUserRoleChanged
  78. case TUIRoomKitService_CurrentUserMuteMessage
  79. case TUIRoomKitService_RoomOwnerChanged
  80. case TUIRoomKitService_ChangeToolBarHiddenState
  81. case TUIRoomKitService_SetToolBarDelayHidden
  82. case TUIRoomKitService_HiddenChatWindow
  83. case TUIRoomKitService_ShowExitRoomView
  84. case TUIRoomKitService_RenewVideoSeatView
  85. case TUIRoomKitService_DismissConferenceViewController
  86. case TUIRoomKitService_ShowFloatChatView
  87. }
  88. func subscribeUIEvent(key: RoomUIEvent, responder: RoomKitUIEventResponder) {
  89. let observer = TUINotificationAdapter(responder: responder)
  90. if var observerArray = uiEventObserverMap[key] {
  91. observerArray.append(observer)
  92. uiEventObserverMap[key] = observerArray
  93. } else {
  94. uiEventObserverMap[key] = [observer]
  95. }
  96. DispatchQueue.main.async {
  97. TUICore.registerEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
  98. }
  99. }
  100. func unsubscribeUIEvent(key: RoomUIEvent, responder: RoomKitUIEventResponder) {
  101. guard var observerArray = uiEventObserverMap[key] else { return }
  102. observerArray = observerArray.filter({ observer in
  103. guard let responderValue = observer.responder else {
  104. DispatchQueue.main.async {
  105. TUICore.unRegisterEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
  106. }
  107. return false
  108. }
  109. if responderValue.isEqual(responder) {
  110. DispatchQueue.main.async {
  111. TUICore.unRegisterEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
  112. }
  113. return false
  114. } else {
  115. return true
  116. }
  117. })
  118. if observerArray.count == 0 {
  119. uiEventObserverMap.removeValue(forKey: key)
  120. } else {
  121. uiEventObserverMap[key] = observerArray
  122. }
  123. }
  124. func notifyUIEvent(key: RoomUIEvent, param: [AnyHashable : Any]) {
  125. DispatchQueue.main.async {
  126. TUICore.notifyEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: nil, param: param)
  127. }
  128. }
  129. func subscribeEngine(event: RoomEngineEvent, observer: RoomEngineEventResponder) {
  130. let weakObserver = { [weak observer] in return observer }
  131. if var observerArray = engineObserverMap[event] {
  132. let listenerObject = observerArray.first { weakObject in
  133. guard let object = weakObject() else { return false }
  134. return object.isEqual(observer)
  135. }
  136. guard listenerObject == nil else { return }
  137. observerArray.append(weakObserver)
  138. engineObserverMap[event] = observerArray
  139. } else {
  140. engineObserverMap[event] = [weakObserver]
  141. }
  142. }
  143. func unsubscribeEngine(event: RoomEngineEvent, observer: RoomEngineEventResponder) {
  144. guard var observerArray = engineObserverMap[event] else { return }
  145. observerArray.removeAll { weakObject in
  146. guard let object = weakObject() else { return true }
  147. return object.isEqual(observer)
  148. }
  149. if observerArray.count == 0 {
  150. engineObserverMap.removeValue(forKey: event)
  151. } else {
  152. engineObserverMap[event] = observerArray
  153. }
  154. }
  155. func notifyEngineEvent(event: RoomEngineEvent, param: [String : Any]) {
  156. guard let observers = engineObserverMap[event] else { return }
  157. observers.forEach { responder in
  158. responder()?.onEngineEvent(name: event, param: param)
  159. }
  160. }
  161. deinit {
  162. debugPrint("deinit \(self)")
  163. }
  164. }