You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Notification Center事件与观察者简化实现及问题咨询

请教:Swift通知封装实现的潜在问题?

嘿,我最近启动了一个新的Swift项目,想简化Notification和Notification Observer的使用流程,所以写了下面这段封装代码。现在把代码分享出来,想问问大家这个实现可能存在哪些潜在问题?

import Foundation
enum EventName: String {
    case ProfileUpdate
    case ApplicationDidPreload
}
class Event {
    static let shared: Event = Event()
    
    /// 向通知中心发送事件
    /// - Parameter event: 要发送的事件名称
    /// - Parameter object: 携带的对象(可选)
    func post(event: EventName, object: Any? = nil) {
        NotificationCenter.default.post(name: Notification.Name(rawValue: event.rawValue), object: object)
    }
    
    /// 添加事件观察者
    /// - Parameter event: 要监听的事件名称
    /// - Parameter queue: 回调队列(可选,默认主队列)
    /// - Parameter handler: 事件触发后的回调闭包
    func observe(event: EventName, queue: OperationQueue? = .main, handler: @escaping (Notification) -> Void) {
        NotificationCenter.default.addObserver(forName: Notification.Name(rawValue: event.rawValue), object: nil, queue: queue, using: handler)
    }
}

我初步想到几个点,但肯定还有遗漏,想听听大家的补充:

  • 内存泄漏风险:当前的observe方法没有提供移除观察者的逻辑。如果调用observe的对象(比如ViewController)被销毁,通知中心还持有回调闭包的强引用,会导致对象无法被释放,引发内存泄漏。
  • 类型安全缺失:通知携带的object是Any?类型,回调时必须强制类型转换,很容易因为类型不匹配导致运行时崩溃。要是能针对不同事件定义专属的参数类型,安全性会高很多。
  • 观察者管理混乱:没有对添加的观察者做统一记录,当需要移除特定观察者时完全无从下手。比如同一个页面多次监听同一个事件,想要取消其中一次监听根本做不到。
  • 单例的局限性:Event用了单例模式,虽然全局调用方便,但单例生命周期和App一致,可能会让不必要的观察者长期驻留内存;而且单例不利于单元测试,很难模拟替换。
  • 重复监听隐患:如果同一个对象重复调用observe监听同一个事件,会添加多个独立的观察者,事件触发时回调会执行多次,容易引发逻辑错误,当前实现没有去重处理。

麻烦各位帮忙分析下还有哪些潜在问题~

内容的提问来源于stack exchange,提问作者Vadims Krutovs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:41:53