Как объединить промежуточные события в потоке Reactive Framework? - PullRequest
1 голос
/ 22 июня 2010

Я все еще довольно новичок в Rx и мне трудно понять, как выразить эту (на первый взгляд) простую подписку.Я ищу что-то вроде этого:

  1. Начало: InTransaction.Where (inTransaction => inTransaction)
  2. Если: ItemChanged или On FlagChanged, пусть Changed = true
  3. End: InTransaction.Where (inTransaction =>! InTransaction)

Все вышеперечисленное является наблюдаемым.Поэтому после начала транзакции я хочу начать обращать внимание на уведомления об изменениях, и независимо от того, сколько из них приходит, я просто хочу помнить, что они были получены.Когда транзакция заканчивается, я хочу вызвать свой обработчик для обновления визуального состояния.

В Интернете есть много интересных примеров, показывающих, как это сделать для перетаскивания мышью.Единственная проблема, с которой я столкнулся, заключается в том, что я не хочу получать каждое измененное событие.Я просто хочу знать, был ли кто-нибудь поражен до завершения транзакции.

Может ли кто-нибудь помочь мне указать правильный путь?

Обновление: мой текущий алгоритм выглядит примерно так:

bool pendingRefresh = false;

Observable
    .Merge(
        _selectionChanged,
        _objectManager
            .PropertiesChanged
            .Where(objects => objects.Contains(_selectedObject)))
    .Subscribe(_ => pendingRefresh = true);

_actionManager
    .IsInTransaction.Where(isIn => !isIn)
    .Throttle(TimeSpan.FromSeconds(0.15))
    .Subscribe(_ => 
        {
            if (pendingRefresh)
            {
                pendingRefresh = false;
                Refresh();
            }
        });

Работает нормально, но мне было интересно, смогу ли я выбраться с одной подпиской.

1 Ответ

3 голосов
/ 23 июня 2010

похоже, что вы на правильном пути.Если вам неважно, сколько поступит уведомлений об изменениях, посмотрите на оператор «Любой»:

public static IObservable<bool> Any<TSource>(this IObservable<TSource> source)

, он сработает только один раз, в тот момент, когда в него поступит первое сообщение, и сработает trueOnCompleted произойдет без какого-либо сообщения, оно вызовет false.

Надеюсь, это поможет.

Jeffrey

...