MST

星途 面试题库

面试题:SwiftUI中NotificationCenter跨模块通信优化

假设在一个大型SwiftUI项目中,多个模块之间需要通过NotificationCenter进行复杂的通知交互。请设计一套优化方案,提高通知传递的效率、降低耦合度,同时确保代码的可维护性和扩展性,阐述方案的设计思路及关键代码实现。
26.2万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 引入中间层:创建一个专门的通知管理类作为中间层,负责接收和分发通知,减少模块间直接依赖。
  2. 协议与委托模式:使用协议和委托模式,使模块通过遵守协议来接收通知,而不是直接依赖NotificationCenter
  3. 集中注册与注销:在中间层集中管理通知的注册和注销,避免在各个模块中分散处理,增强代码的可维护性。
  4. 类型安全:使用泛型来确保通知传递的数据类型安全,避免在运行时出现类型错误。

关键代码实现

  1. 定义通知协议
protocol NotificationProtocol {
    associatedtype NotificationData
    func receiveNotification(data: NotificationData)
}
  1. 创建通知管理类
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)
    }
}
  1. 使用示例
// 模块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进行,提高了效率,降低了耦合度,并且代码的可维护性和扩展性得到提升。