可观察的非空值可观察的真

c# reactivex

141 观看

1回复

566 作者的声誉

这是一个很难解释的东西,首先看一下代码:

public static IObservable<bool> NotNullAnd<T>(IReadOnlyReactiveProperty<T> prop,
    Func<T, IObservable<bool>> andSelector)
{
    var notNull = prop.Select(l => l != null);

    var isExecuting = prop
        .Where(l => l != null)
        .SelectMany(l => andSelector(l));

    return notNull.CombineLatest(isExecuting, (x, y) => x && y);
}

这段代码似乎有效,但是我不确定这是否是最好的方法。

基本上,我正在寻找一种方法来检查对象上的可观察对象何时触发,但是该对象可能为null,因此我需要先进行检查。因此,组合将检查属性何时更改,如果不为null,则侦听对象上的另一个属性...难以解释,但测试可能有助于解释:

private class Loader
{
    public ReactiveProperty<bool> IsExecuting
        = new ReactiveProperty<bool>();
}

[Test]
public void TestNotNullAnd()
{
    var loaderProp = new ReactiveProperty<Loader>();

    var isExecutingProp = NotNullAnd(loaderProp, l => l.IsExecuting)
        .ToReadOnlyReactiveProperty();

    var loader = new Loader();

    Assert.IsFalse(isExecutingProp.Value);

    loaderProp.Value = loader;
    Assert.IsFalse(isExecutingProp.Value);

    loaderProp.Value.IsExecuting.Value = true;
    Assert.IsTrue(isExecutingProp.Value);

    loaderProp.Value.IsExecuting.Value = false;
    Assert.IsFalse(isExecutingProp.Value);

    loaderProp.Value.IsExecuting.Value = true;
    Assert.IsTrue(isExecutingProp.Value);

    loaderProp.Value.IsExecuting.Value = false;
    Assert.IsFalse(isExecutingProp.Value);

    loaderProp.Value.IsExecuting.Value = true;
    Assert.IsTrue(isExecutingProp.Value);

    loaderProp.Value = null;
    Assert.IsFalse(isExecutingProp.Value);

    loaderProp.Value = loader;
    Assert.IsTrue(isExecutingProp.Value);
}

如前所述,所有这些测试都通过了,但是我不确定是否有更好的方法,另外我担心我会在这里某处引入内存泄漏,因为我没有处理对“ l.IsExecuting”的监听。

我使用Unity的“ UniRx”库。

作者: mikeysee 的来源 发布者: 2017 年 9 月 15 日

回应 1


2

1492 作者的声誉

决定

正确的答案:啊,我现在看到您希望null从中prop发出falses。在这种情况下,您可以简单地将null映射到wrapped false,然后将其展平到返回流中:

public static IObservable<bool> NotNullAnd<T>(IReadOnlyReactiveProperty<T> prop,
    Func<T, IObservable<bool>> andSelector)
{
  return prop.SelectMany(l => l == null ? Observable.Return(false) : andSelector(l));
}

过时的回答: 已经使用过滤掉了null prop的值Where(l => l != null),因此构造notNull并将其组合isExecuting为多余的。此外,这是危险的,因为notNullisExecuting可能不同步是完美的,你可能会意外翻转一些值,尤其是当你链更加运营商。

以下内容就足够了:

public static IObservable<bool> NotNullAnd<T>(IReadOnlyReactiveProperty<T> prop,
    Func<T, IObservable<bool>> andSelector)
{
    return prop
        .Where(l => l != null)
        .SelectMany(l => andSelector(l));
}

作者: concat 发布者: 2017 年 9 月 15 日
32x32