ReactiveUI: Как отменить Observable от ReactiveCommand?

1

У меня есть следующее:

Compress = this.WhenAnyValue(x => x.ImagesCount, x => x > 0).ToCommand();
var process = Compress.RegisterAsync(ConvertImages);
var subscription = process.Subscribe(x => Images.Remove(x));

CancelConversion = this.WhenAnyValue(x => x.ImagesCount, x => x.IsBusy, (count, busy) => count > 0 && busy).ToCommand();
CancelConversion.RegisterAsyncAction();

Где ConvertImages(object o) - частный метод ViewModel, который, в свою очередь, вызывает и возвращает результат ConvertImages(IEnumerable<ImageDto> images) в классе службы, который изменяет размеры и сжимает изображения и возвращает IObservable<ImageDto>.

Paul Betts предлагает здесь реализовать отмену через реализацию моего IObservable например, используя Observable.create, так может ли кто-нибудь представить пример того, как реализовать такой Observable?

Также каков способ RxUI сигнализировать об этой отмене? Должна ли я subscription.Dispose() в CancelConversion.RegisterAsyncAction()? Должен ли я добавить .TakeUntil(CancelConversion.Execution_Signaled) в var process, как я могу определить "CancelConversion.Execution_Signaled"?

Теги:
reactiveui

1 ответ

4
Лучший ответ

Это довольно легко:

CancelConversion = this.WhenAnyValue(x => x.ImagesCount, x => x.IsBusy, (count, busy) => count > 0 && busy).ToCommand();

this.WhenAnyValue(x => x.ImagesCount, x => x > 0).ToCommand();

var process = Compress.RegisterAsync(x => ConvertImages().TakeUntil(CancelConversion));
var subscription = process.Subscribe(x => Images.Remove(x));

Обработка фактического аннулирования (т.е. Прекращение любой работы, которую действительно выполняет ConvertImages) зависит от вашей реализации ConvertImages.

  • 1
    «Это довольно просто». Именно так я и думал! Так TakeUntil() будет Dispose() подписки , как только он закончил правильно? Спасибо за ответ.
  • 0
    @LucianoDelucchi Да, вы правы - вам обычно не нужно явно управлять расходными материалами
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню