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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:24:05