ios - 合并和 NotificationCenter : Notifications not working

标签 ios swift nsnotificationcenter combine

<分区>

我写了一个非常简单的应用程序来测试 Combine 和 NotificationCenter:


extension Notification.Name {
    static let Test = Notification.Name(rawValue: "Test")
}

// SOLUTION 1
NotificationCenter.default
            .publisher(for: .Test)
            .sink(receiveCompletion: { _ in
                print("SOLUTION 1: COMPLETION")
            }, receiveValue: { _ in
                print("SOLUTION 1: VALUE")
            })

// SOLUTION 2
    NotificationCenter.Publisher(center: .default, name: .Test)
        .sink(receiveCompletion: { _ in
            print("SOLUTION 2: COMPLETION")
        }, receiveValue: { _ in
            print("SOLUTION 2: VALUE")
        })

// SOLUTION 3
NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: .Test, object: nil)

@objc
func doSomething() {
        print("SOLUTION 3: VALUE")
}

// RAISE NOTIFICATION

NotificationCenter.default.post(name: .Test, object: nil)NotificationCenter.default.post(name: .Test, object: nil)

使用 Combine 无法捕获通知。唯一可行的解​​决方案是第三种,旧式的。奇怪的是,如果我在 Playground 中运行相同的代码,它会起作用!

该项目的部署目标是 iOS 13。我已经在物理设备和模拟器上执行了该应用程序。我还安装了 iOS 13.2.2 模拟器。

有什么建议吗?

最佳答案

不要忘记将可取消实例存储在集合或变量中。 示例(使用 Set):

private var cancellableBag = Set<AnyCancellable>()

NotificationCenter.default
    .publisher(for: .Test)
    .sink(receiveCompletion: { _ in
        print("SOLUTION 1: COMPLETION")
    }, receiveValue: { _ in
        print("SOLUTION 1: VALUE")
    })
    .store(in: &cancellableBag)

或者使用变量:

private let cancellable: AnyCancellable?

cancellable = NotificationCenter.default
    .publisher(for: .Test)
    .sink(receiveCompletion: { _ in
        print("SOLUTION 1: COMPLETION")
    }, receiveValue: { _ in
        print("SOLUTION 1: VALUE")
    })

关于ios - 合并和 NotificationCenter : Notifications not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59666945/

上一篇:ios - 手动安装 Firebase 时出错 (Swift)

下一篇:iOS - 绕过蓝牙配对警报

相关文章:

ios - 即使只添加一次观察者,通知也会被触发两次

ios - 如何在多个 View 上处理keyboardDidShow?

swift - 在分数上加分 (Swift)

iphone - 请解释这可能是如何泄漏的 - 字符串编码函数

ios - 点击后 UitableView 改变 sectionView

ios - 你如何在 Swift 3 中使用 Data.withUnsafeMutableBytes?

macos - 如何在 Swift 中单击按钮时填充 NSTableView

ios - 无法在 iOS 中设置按钮宽度

ios - 将 Obj-C 观察器转换为 Swift 语法时遇到问题

ios - 将 .p12 证书存储在钥匙串(keychain)中以备后用