не срабатывает append в итоге...
Есть такой код:
func testPrefix(){
let counter = CurrentValueSubject<Int, Never>(0).eraseToAnyPublisher()
let shouldBeCancelled = Just(true).share()
shouldBeCancelled
.print("before_map")
.map { _ in counter }
.switchToLatest()
.print("before_prefix")
.prefix(untilOutputFrom: shouldBeCancelled.filter {$0})
.append(999)
.print("sink")
.sink()
.store(in: &cancellables)
let delayExpectation = XCTestExpectation()
delayExpectation.isInverted = true
wait(for: [delayExpectation], timeout: 0.2)
}
вот какой лог получается:
before_prefix: receive subscription: (SwitchToLatest)
before_prefix: receive cancel
before_map: receive subscription: (CurrentValueSubject)
before_map: receive cancel
почему так происходит? поидеи должно просто завершить поток сработать append, а тут прям на корню обрубает этот prefix
что не так?
Ну смотри, 0 не выводится потому что стоит .prefix(untilOutputFrom: shouldBeCancelled.filter {$0}) Если его убрать мы всё таки его получим: before_prefix: receive subscription: (SwitchToLatest) sink: receive subscription: (Concatenate) sink: request unlimited before_prefix: request unlimited before_map: receive subscription: (Multicast) before_map: request unlimited before_map: receive value: (true) before_prefix: receive value: (0) sink: receive value: (0) before_map: receive finished Остаётся вопрос, почему не выводится 999? А не выводится он потому что .append(999) сработывает только тогда, когда он получит finish от выщестоящего, но он его никогда не получает, потому на вершине цепочки стоит Subject, который не завершается сам по себе. А вот если его завершится явно, специально делаю это по прошествию какого-то времени, срабатывает .append(999)
я знаю все это, мне надо как раз что бы 999 был с перфиксом, т.к. перфикс по идеи должен был завершить поток, а не отменить его
Да потому что у тебя цепочка никогда не стартует. Если задать вопросом где сработает быстрее shouldBeCancelled? В начале цепочики или в .prefix(untilOutputFrom: shouldBeCancelled) ? Сработает сначала именно в .prefix(untilOutputFrom: shouldBeCancelled) и завершится. А сама цепочка никогда не начинается, потому что Just у тебя share и уже отработал.
Обсуждают сегодня