Swift中NotificationCenter的publisher订阅闭包被重复触发是什么原因?
问题原因汇总
- 重复订阅是最高发原因:如果订阅代码被执行多次,就会生成多个有效的订阅关系,单次通知会触发所有匹配订阅的回调,常见场景如下:
- 自定义模型类被多次实例化,每个实例都独立执行了一次订阅逻辑
- 订阅代码放在了可重复调用的方法(例如视图的
viewWillAppear/viewDidAppear、业务侧重复触发的初始化方法)中,每次调用都会新增一个订阅 - 重复赋值订阅变量时未主动取消上一次的订阅:如果
helloSubscriber是单个AnyCancellable类型变量,第二次赋值时旧的订阅如果没有调用cancel(),会依然存活并持续接收通知 - 订阅 cancellable 存入
Set<AnyCancellable>统一管理时,没有在实例复用、页面销毁等时机清空旧订阅集合,导致历史订阅残留
- 订阅未过滤发送方:你发送通知时传入了
object: obj,但订阅时仅指定了通知名没有限制匹配的发送方object,此时如果存在其他同名通知(哪怕发送方object不同)也会触发你的订阅回调。即使你确认自己的发送逻辑只执行了一次,也可能存在第三方库、系统组件发送了同名通知的情况,建议先确认通知名的全局唯一性,也可以在订阅时补上object参数过滤发送方:helloSubscriber = NotificationCenter.default.publisher(for: .helloStack, object: obj) .receive(on: DispatchQueue.main) .sink { [weak self] notification in // 业务逻辑 }
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

