172 похожих чатов

Всем привет! Подскажите по комбайну пожалуйста Проблема: паблишер сразу отменяется и

не срабатывает 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

что не так?

3 ответов

8 просмотров

Ну смотри, 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)

Ivan-Gaydamakin Автор вопроса

я знаю все это, мне надо как раз что бы 999 был с перфиксом, т.к. перфикс по идеи должен был завершить поток, а не отменить его

Ivan Gaydamakin
я знаю все это, мне надо как раз что бы 999 был с ...

Да потому что у тебя цепочка никогда не стартует. Если задать вопросом где сработает быстрее shouldBeCancelled? В начале цепочики или в .prefix(untilOutputFrom: shouldBeCancelled) ? Сработает сначала именно в .prefix(untilOutputFrom: shouldBeCancelled) и завершится. А сама цепочка никогда не начинается, потому что Just у тебя share и уже отработал.

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
I just installed it but how do I use it?
Talula
12
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Что то ничего у меня не взлет :( может что то еще с биос покрутить нужно ?
Александр Сергеевич
9
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Карта сайта