面试题答案
一键面试设计思路
- 引入中间层:创建一个专门的通知管理类作为中间层,负责接收和分发通知,减少模块间直接依赖。
- 协议与委托模式:使用协议和委托模式,使模块通过遵守协议来接收通知,而不是直接依赖
NotificationCenter
。 - 集中注册与注销:在中间层集中管理通知的注册和注销,避免在各个模块中分散处理,增强代码的可维护性。
- 类型安全:使用泛型来确保通知传递的数据类型安全,避免在运行时出现类型错误。
关键代码实现
- 定义通知协议
protocol NotificationProtocol {
associatedtype NotificationData
func receiveNotification(data: NotificationData)
}
- 创建通知管理类
class NotificationManager {
private var observers = [AnyHashable: Any]()
func register<T: NotificationProtocol>(observer: T, for notificationName: String) {
observers[notificationName] = observer
}
func unregister(for notificationName: String) {
observers[notificationName] = nil
}
func post<T: NotificationProtocol>(notificationName: String, data: T.NotificationData) {
guard let observer = observers[notificationName] as? T else { return }
observer.receiveNotification(data: data)
}
}
- 使用示例
// 模块A
class ModuleA: NotificationProtocol {
typealias NotificationData = String
func receiveNotification(data: String) {
print("ModuleA received: \(data)")
}
}
// 模块B
class ModuleB {
let notificationManager = NotificationManager()
func setup() {
let moduleA = ModuleA()
notificationManager.register(observer: moduleA, for: "SomeNotification")
}
func sendNotification() {
notificationManager.post(notificationName: "SomeNotification", data: "Hello from ModuleB")
}
}
通过以上方案,项目中的模块间通知交互通过NotificationManager
进行,提高了效率,降低了耦合度,并且代码的可维护性和扩展性得到提升。