Рассмотрим следующий пример:
cancellable = Just(2).map { x in
Just(x * x).delay(for: 2.0, scheduler: RunLoop.main)
}
.switchToLatest()
.sink(receiveCompletion: {_ in
print("completed")
}, receiveValue: {result in
print(result)
})
Здесь я пытаюсь имитировать поведение известного оператора switchMap, используя операторы Combine. Я ожидаю получить результат через две секунды и завершение. На самом деле ни результата, ни завершения не наступает. Что очень плохо, потому что апстрим завершен!
Похоже, switchToLatest отменяет себя, как только восходящий поток завершается, и забывает завершить. С другой стороны, если я заменю его на flatMap
, все будет работать, как ожидалось.
Есть ли хорошие примеры правильного оператора switchMap?
Отказ от ответственности: хорошо, я понимаю, что мой апстрим завершен. Хотя я хочу, чтобы мой switchMap работал независимо от того, завершился ли мой апстрим до внутреннего издателя или после.
.receive(on: queue).combineLatest(Just(2))
. Просто молчит, как в вашем примере, иflatMap
работает нормально. - person Ben Affleck   schedule 25.11.2019