我正在尝试合并两个发布者,但其中一个从未运行过。
以下是我如何创建我的两个发布者并尝试使用 .sink
观察它们何时完成。 featureFlagPublisher
将按预期完成并打印“featureFlagPublisher done”,但 migratePublisher
和合并的发布者永远不会完成。publisher.send(completion: .finished)
运行但没有任何反应。
private var cancellables = Set<AnyCancellable>()
func start() {
let featureFlagPublisher = self.startFeatureFlagging()
let migratePublisher = self.migrate()
migratePublisher.sink { _ in
print("migratePublisher done")
} receiveValue: { _ in }.store(in: &cancellables)
featureFlagPublisher.sink { _ in
print("featureFlagPublisher done")
} receiveValue: { _ in }.store(in: &cancellables)
migratePublisher.merge(with: featureFlagPublisher)
.sink { completion in
print("All Done")
} receiveValue: { _ in }
.store(in: &cancellables)
}
private func startFeatureFlagging() -> AnyPublisher<Bool, Never> {
let future = Future<Bool, Never> { promise in
FeatureFlaggingService.shared.start {
promise(.success(true))
}
}
return future.eraseToAnyPublisher()
}
private func migrate() -> AnyPublisher<Bool, Never> {
let future = Future<Bool, Never> { promise in
FavoriteMigrationsAPI.shared.get { result in
switch result {
case .success(let favoriteIDs):
promise(.success(true))
...
}
}
return future.eraseToAnyPublisher()
}
答案 0 :(得分:0)
事实证明,问题是控制器提前解除初始化,因此承诺无法响应观察者。所以它与Combine 或我发布的代码无关,而是与我初始化控制器的方式有关。