1

我尝试使用RX写一个类来管理动画序列。不幸的是,我发现它不起作用,当我调试它时,我发现我总是得到_sequence的值是null;似乎No result is返回。我怀疑 AnimationSequence() 方法有问题。但我不确定,任何专家可以帮助我吗?

 public class AnimationManager : IDisposable
{
    private IDisposable _sequence;
    private ISequentialResult _result;

    private readonly List<Func<IObserver<ISequentialResult>, ISequentialResult, ISequentialResult>> _animationQueue
        = new List<Func<IObserver<ISequentialResult>, ISequentialResult, ISequentialResult>>();


    public void AddAnimation(Func<IObserver<ISequentialResult>, ISequentialResult, ISequentialResult> sequence)
    {
        _animationQueue.Add(sequence);
    }

    public void Run(Action<Exception> exception, Action<ISequentialResult> completed)
    {

        var sequence = AnimationSequence().ToObservable();

        _sequence = sequence.Subscribe(
            next => { },
            exception,
            () => completed(_result));
    }

    private IEnumerable<IObservable<Object>> AnimationSequence()
    {
        var x = 0;

        _result = new DefaultSeqResult(null) { Value = this };
        while (x < _animationQueue.Count)
        {
            var sequence = _animationQueue[x];


            var step = Observable.Create<ISequentialResult>(
                observer =>
                {
                    var newResult = sequence(observer, _result);
                    newResult.Results.Add(_result);
                    newResult.Results.AddRange(_result.Results);
                    _result = newResult;
                    return () => { };
                }
                );
            yield return step;

            x++;
        }

        _result.Results.Add(_result);
    }

    public void Dispose()
    {
        if (_sequence != null) _sequence.Dispose();
    }

}
4

1 回答 1

0

_sequenceSubscribe()在返回之前不会得到值。并且由于您订阅了IEnumerable.ToObservable(),Subscribe最终在返回之前完全迭代了可枚举。实际上,Run将阻塞,直到处理完整个序列。

其次,您订阅的是一个IObservable<IObservable<object>>. 但是您永远不会遍历内部序列,因此它们实际上从不做任何事情。这可能就是您所说的“它不起作用”的意思。

如果要按顺序运行内部序列,请执行以下操作:

var sequence = AnimationSequence().Concat();

如果要并行运行内部序列,请执行以下操作:

var sequence = AnimationSequence().Merge();

其中任何一个都应该让它“去”。

于 2013-09-06T15:26:54.773 回答