Помогите с использованием класса Subject в библиотеке Reactive Extensions - PullRequest
0 голосов
/ 25 июня 2010

Я пытаюсь использовать пару классов Subject для запуска 2 наборов последовательностей событий.Приложение представляет собой приложение для рисования, где один субъект запускает OnNext, когда пользователь нажимает кнопку, а другой субъект запускает OnNext, когда пользователь выполняет двойной щелчок.Я написал методы GetClick & GetDoubleClick, которые возвращают наблюдаемое для вышеупомянутых случаев и, кажется, работают нормально.Проблема в приведенном ниже коде состоит в том, что если вызвать onNext первого субъекта для запуска последовательности щелчков, наблюдаемый двойной щелчок никогда не вызывается.Если я закомментирую вызов onNext по первому вопросу, наблюдаемый двойной щелчок действительно будет запущен, как и ожидалось.Может кто-нибудь взглянуть на код ниже и их идеи / мысли вместе?Я добавил комментарии к проблемной строке кода ниже

public static KeyValuePair<IObservable<MapPoint>, IObservable<PointCollection>> 
    DrawPointsDynamic(this Map map)
{
    PointCollection pc = new PointCollection();
    Subject<Point> ptSubject = new Subject<Point>();
    Subject<PointCollection> ptsSubject = new Subject<PointCollection>();

    IObservable<Point> ptObs = ptSubject.Hide();
    IObservable<PointCollection> ptsObs = ptsSubject.Hide();

    map.GetClick()
        .Subscribe(next =>
            {
                var p = map.ScreenToMap(next.EventArgs.GetPosition(map));
                ptSubject.OnNext(p); //If I leave this line in, the subscription to the doubleClick below does not get called. If comment it out, the subscription below does get called as expected;
                pc.Add(p);

            });

    map.GetDoubleClick()
        .Subscribe(next =>
        {
            ptsSubject.OnNext(pc);
            pc = new ESRI.ArcGIS.Client.Geometry.PointCollection();
        });

    KeyValuePair<IObservable<MapPoint>, IObservable<ESRI.ArcGIS.Client.Geometry.PointCollection>> obs =
        new KeyValuePair<IObservable<MapPoint>, IObservable<ESRI.ArcGIS.Client.Geometry.PointCollection>>
            (ptObs, ptsObs);

    return obs;
}

Кроме того, я не совсем уверен, что делает Hide ().Я просто использую его, так как все примеры, кажется, имеют их.Что на самом деле означает скрытие личности?

1 Ответ

1 голос
/ 25 июня 2010

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

public static KeyValuePair<IObservable<MapPoint>, IObservable<PointCollection>> 
    DrawPointsDynamic(this Map map) 
{
    var pc = new PointCollection();
    var ptSubject = map.GetClick().Select(next => map.ScreenToMap(next.EventArgs.GetPosition(map)).Publish();
    var ptsSubject = map.GetDoubleClick().Publish();

    ptSubject.Subscribe(pc.Add);
    ptsSubject.Subscribe(_ =>  pc = new PointCollection());

    ptSubject.Connect();
    ptsSubject.Connect();

    return new KeyValuePair<IObservable<MapPoint>, IObservable<PointCollection>>(ptObs, ptsObs);
}

Теперь, глядя на это, я подозреваю, что вы действительно хотите, хотя это:

public static IObservable<PointCollection> DrawPointsDynamic(this Map map)
{
    var pcs = map.GetDoubleClick().Select(_ => new PointCollection()).Publish();
    var ps = map.GetClick().Select(next => map.ScreenToMap(next.EventArgs.GetPosition(map)));
    var ppcs = pcs.SelectMany(pc => ps.Select(p => { pc.Add(p); return pc; }).TakeUntil(pcs));

    var obs = pcs.Merge(ppcs);

    pcs.Connect();

    return obs;
}

Это вернет наблюдаемое, которое будет производить PointCollection при щелчке или двойном щелчке с точками или без них.

...