Xamarin Reactive Observable Throttling не работает

Я хочу дросселировать датчик ориентации Xamarin.Essential следующее:

Observable.FromEventPattern<OrientationSensorChangedEventArgs>(
    ev => OrientationSensor.ReadingChanged += ev,
    ev => OrientationSensor.ReadingChanged -= ev
)
.Throttle(TimeSpan.FromMilliseconds(500))
.Subscribe(x => { onOrientationChanged(x.Sender, x.EventArgs); });

OrientationSensor.Start(SensorSpeed.UI);

Метод-обработчик имеет следующую подпись:

void onOrientationChanged(object sender, OrientationSensorChangedEventArgs e)
{
}

Если я пропущу Throttle метод, все отлично работает. С Throttle там ничего не стреляет вообще.

1 ответ

Как я понимаю, вы хотите повернуть экран, но не сразу - только через 500 мс. В таком случае вы должны использовать .Debounce(TimeSpan.FromMilliseconds(500)) вместо .Throttle по строке 4.

Разница между Throttle и Debounce такова:

  • Дебандирование будет принимать все входящие события в течение 500 мс и будет генерировать только последнее.

  • Дроссель работает немного по-другому: он берет первое событие в течение 500 мс и испускает его; все остальные события игнорируются до истечения периода 500 мс. Из-за этого вы получаете только небольшое изменение в качестве первого события, которого недостаточно для завершения вращения.

Другие вопросы по тегам