Files
midi_ios/TUIKit/TUIRoomKit/Source/View/Model/EngineEventCenter.swift
2025-08-14 10:07:49 +08:00

184 lines
6.5 KiB
Swift

//
// EngineEventCenter.swift
// TUIRoomKit
//
// Created by aby on 2023/1/8.
// Copyright © 2023 Tencent. All rights reserved.
//
import Foundation
import TUICore
protocol RoomKitUIEventResponder: NSObject {
func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable: Any]?)
}
protocol RoomEngineEventResponder: NSObject {
func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String: Any]?)
}
class TUINotificationAdapter:NSObject ,TUINotificationProtocol {
weak var responder: RoomKitUIEventResponder?
init(responder: RoomKitUIEventResponder? = nil) {
self.responder = responder
}
func onNotifyEvent(_ key: String, subKey: String, object anObject: Any?, param: [AnyHashable : Any]?) {
guard let eventKey = EngineEventCenter.RoomUIEvent(rawValue: subKey) else { return }
responder?.onNotifyUIEvent(key: eventKey, Object: anObject, info: param)
}
deinit {
debugPrint("deinit \(self)")
}
}
class EngineEventCenter: NSObject {
// Weak Ref
typealias WeakArray<T> = [() -> T?]
static let shared = EngineEventCenter()
private var engineObserverMap: [RoomEngineEvent: WeakArray<RoomEngineEventResponder>] = [:]
private var uiEventObserverMap: [RoomUIEvent: [TUINotificationAdapter]] = [:]
private override init() {
super.init()
}
enum RoomEngineEvent: String {
case onKickedOffLine
case onRoomDismissed
case onKickedOutOfRoom
case onUserVideoStateChanged
case onUserAudioStateChanged
case onUserVoiceVolumeChanged
case onUserScreenCaptureStopped
case onRequestReceived
case onSendMessageForUserDisableChanged
case onRemoteUserEnterRoom
case onRemoteUserLeaveRoom
case onUserRoleChanged
case onSeatListChanged
case onAllUserCameraDisableChanged
case onAllUserMicrophoneDisableChanged
case onKickedOffSeat
case onStatistics
case onDeletedTakeSeatRequest
case onExitedRoom
case onDestroyedRoom
case onStartedRoom
case onJoinedRoom
case onConferenceInfoChanged
case onInitialSelfUserInfo
case onInitialRoomInfo
case onGetUserListFinished
}
enum RoomUIEvent: String {
case TUIRoomKitService
case TUIRoomKitService_RenewUserList
case TUIRoomKitService_SomeoneSharing
case TUIRoomKitService_RenewSeatList
case TUIRoomKitService_UserOnSeatChanged
case TUIRoomKitService_ShowRoomMainView
case TUIRoomKitService_ShowRoomVideoFloatView
case TUIRoomKitService_CurrentUserHasAudioStream
case TUIRoomKitService_CurrentUserHasVideoStream
case TUIRoomKitService_CurrentUserRoleChanged
case TUIRoomKitService_CurrentUserMuteMessage
case TUIRoomKitService_RoomOwnerChanged
case TUIRoomKitService_ChangeToolBarHiddenState
case TUIRoomKitService_SetToolBarDelayHidden
case TUIRoomKitService_HiddenChatWindow
case TUIRoomKitService_ShowExitRoomView
case TUIRoomKitService_RenewVideoSeatView
case TUIRoomKitService_DismissConferenceViewController
case TUIRoomKitService_ShowFloatChatView
}
func subscribeUIEvent(key: RoomUIEvent, responder: RoomKitUIEventResponder) {
let observer = TUINotificationAdapter(responder: responder)
if var observerArray = uiEventObserverMap[key] {
observerArray.append(observer)
uiEventObserverMap[key] = observerArray
} else {
uiEventObserverMap[key] = [observer]
}
DispatchQueue.main.async {
TUICore.registerEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
}
}
func unsubscribeUIEvent(key: RoomUIEvent, responder: RoomKitUIEventResponder) {
guard var observerArray = uiEventObserverMap[key] else { return }
observerArray = observerArray.filter({ observer in
guard let responderValue = observer.responder else {
DispatchQueue.main.async {
TUICore.unRegisterEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
}
return false
}
if responderValue.isEqual(responder) {
DispatchQueue.main.async {
TUICore.unRegisterEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: observer)
}
return false
} else {
return true
}
})
if observerArray.count == 0 {
uiEventObserverMap.removeValue(forKey: key)
} else {
uiEventObserverMap[key] = observerArray
}
}
func notifyUIEvent(key: RoomUIEvent, param: [AnyHashable : Any]) {
DispatchQueue.main.async {
TUICore.notifyEvent(RoomUIEvent.TUIRoomKitService.rawValue, subKey: key.rawValue, object: nil, param: param)
}
}
func subscribeEngine(event: RoomEngineEvent, observer: RoomEngineEventResponder) {
let weakObserver = { [weak observer] in return observer }
if var observerArray = engineObserverMap[event] {
let listenerObject = observerArray.first { weakObject in
guard let object = weakObject() else { return false }
return object.isEqual(observer)
}
guard listenerObject == nil else { return }
observerArray.append(weakObserver)
engineObserverMap[event] = observerArray
} else {
engineObserverMap[event] = [weakObserver]
}
}
func unsubscribeEngine(event: RoomEngineEvent, observer: RoomEngineEventResponder) {
guard var observerArray = engineObserverMap[event] else { return }
observerArray.removeAll { weakObject in
guard let object = weakObject() else { return true }
return object.isEqual(observer)
}
if observerArray.count == 0 {
engineObserverMap.removeValue(forKey: event)
} else {
engineObserverMap[event] = observerArray
}
}
func notifyEngineEvent(event: RoomEngineEvent, param: [String : Any]) {
guard let observers = engineObserverMap[event] else { return }
observers.forEach { responder in
responder()?.onEngineEvent(name: event, param: param)
}
}
deinit {
debugPrint("deinit \(self)")
}
}