ios - 合并和通知中心:通知不起作用
问题描述
我编写了一个非常简单的应用程序来测试 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")
})
推荐阅读
- python - 我可以将特定除数(浮点数)与列表中的特定值(字符串)相关联吗?
- python - 如何处理 lambda 表达式中的正则表达式和 null 值?
- schema.org - 以编程方式基于 JSON-LD 上下文生成表单
- typescript - ViewStyle 不可分配给 StyleProp 类型
- java - Mapstruct - 没有符合条件的 bean 类型
- arrays - Xcode 12 - SwiftUI - 字符串数组到按钮
- asp.net-core - 使用 ASP.NET Core 5.0 进行基于角色的授权
- google-api - 如何在 Google Calendar API 中获取 CalendarListEntry 的真正所有者以区分拥有日历和共享日历?
- wpf - 如何绑定到 ContentControl 内容对象的属性
- c++ - 二进制表达式的无效操作数('std::ostream'(又名'basic_ostream
'和'无效')