Roland Pheasant使用DynamicData实现尾部方法

时间:2018-11-14 09:59:44

标签: c# system.reactive reactiveui

我试图弄清楚如何使用DynamicData库。我需要使方法可以处理源的更改并仅通过最后n个更改。它可以命名为 Tail()。程序包中有一个名为 Top()的方法,它使用IVirtualRequest的方法。我已经基于此功能编写了示例:

public static class Extensions
    {
        public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source,
                                                         int numberOfItems)
        {    
            var request = new TailRequest<T>(source, numberOfItems);
            return source.Virtualise(Observable.Return(request));
        }
    }

    public class TailRequest<T> : IVirtualRequest, IDisposable
    {
        private readonly IDisposable subscription;
        private int _count;

        public int Size { get; }

        public int StartIndex => _count > Size ? _count - Size : 0;

        public TailRequest(IObservable<IChangeSet<T>> source, int numberOfItems)
        {
            //how to dispose this from outside???
            subscription = source.Subscribe(RefreshStartIndex);
            Size = numberOfItems;
        }

        private void RefreshStartIndex(IChangeSet<T> changeSet)
        {
            _count += changeSet.Adds;
            _count -= changeSet.Removes;
        }

        public void Dispose()
        {
            subscription.Dispose();
        }
    }

但是,如果我使用以下方法,我将无法从外部处理此请求:

SourceList<Message> sourceList = new SourceList<Message>();
var subscription = _sourceList.Connect()
            .Tail(15)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Bind(Messages)
            .Subscribe();

我认为subscription.Dispose()不会处理我的TailRequest。 还是有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

这可以解决问题

public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source, int numberOfItems)
{
    return Observable.Create<IChangeSet<T>>(observer =>
    {
        var request = new TailRequest<T>(source, numberOfItems);

        return new CompositeDisposable
        (
         request,
         source.Virtualise(Observable.Return(request)).SubscribeSafe(observer)
        );
});

Observable.Create内部的函数返回一个一次性对象,该对象用于清除由Observable创建的任何资源。处置消费用户时,还会创建功能中创建的内部一次性用品。