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 мс. Из-за этого вы получаете только небольшое изменение в качестве первого события, которого недостаточно для завершения вращения.