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
相关产品推荐
相关产品推荐

