发布者接收器从不运行完成

时间:2021-01-08 09:52:15

标签: swift combine

我正在尝试合并两个发布者,但其中一个从未运行过。
以下是我如何创建我的两个发布者并尝试使用 .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()
}

1 个答案:

答案 0 :(得分:0)

事实证明,问题是控制器提前解除初始化,因此承诺无法响应观察者。所以它与Combine 或我发布的代码无关,而是与我初始化控制器的方式有关。