RxSwift throttle(), чтобы получить первый элемент
Я ищу способ, которым throttle()
Оператор отказывается от первого элемента в Observable
в течение определенного промежутка времени, а не последний элемент.
Аналогичный вопрос был задан (и получен ответ) в RxSwift - Debounce / Throttle "inverse", но в тех ответах есть недостатки, которых я бы хотел избежать. То есть в идеальном сценарии первый элемент, испускаемый в Observable
получается, и любые будущие из них игнорируются в течение интервала времени. Однако при работе с window()
или же timer()
, возможно, что два элемента продолжаются в течение заданного интервала времени, потому что таймер не работал параллельно с началом throttle()
вызов. Пример:
|..........|..........|..........|
^ ^
first second
Они попадают в разные окна и поэтому принимаются несовершенным решением, описанным в связанном ответе.
В идеале должен быть способ перезапустить таймер, как только появится первый элемент в окне, так что приведенный выше пример будет выглядеть примерно так:
|..........|.......|..........|
^ ^
first second (ignored)
Есть идеи?
Редактировать: чтобы быть ясным, я не уверен, как Throttle() RxSwift 3.0-beta1 обрабатывает это, но я ищу решение для реализаций RxSwift 2.x.
1 ответ
Оказывается, rxSwift 3.0 имеет дело с throttle()
именно так, как я хотел. Он берет элемент, а затем игнорирует любые другие элементы в течение x секунд (без "проблемы с окном", о которой я говорил в вопросе).
Для полноты картины: debounce()
по-прежнему работает в соответствии со "старым" определением регулирования rxSwift. То есть он берет последний элемент за промежуток времени.