我写了一个非常简单的应用来测试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模拟器。
有什么建议吗?
发布于 2020-01-10 00:04:26
不要忘记将您的可取消实例存储在一个集合或变量中。示例(使用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")
})https://stackoverflow.com/questions/59666945
复制相似问题