如何在 ReactiveUI 中使用 WhenAny(...) 合并多个可观察值?

2024-01-08

我有一个问题,它是本网站上提出的以下问题的延伸。

当返回类型不重要时,是否有更优雅的方法来合并可观察量? https://stackoverflow.com/questions/8010372/is-there-a-more-elegant-way-to-merge-observables-when-return-type-is-unimportant/21762027#21762027

我有一个IObservable<Unit>(可以说X),反应式集合(Y)和属性(Z)。返回类型并不重要。我只想在其中任何一个发生变化时订阅。

我知道如何观察所有 3 个并且Subscribe using Observable.Merge如下。

Observable.Merge(X, Y.Changed, ObservableForProperty(Z).Select(_ => Unit.Default)).Subscribe(..)

它有效。

但是,当我尝试使用WhenAny(...,....,....).Subscribe(),当我的X变化。使用执行上述操作的语法是什么WhenAny(...)而不是Observable.Merge(..)??

我更喜欢使用WhenAny(....)因为我正在使用ReactiveUI在其他地方。

例子: 假设我有一个派生类ReactiveObject具有以下属性。

public class AnotherVM : ReactiveObject
{
    public bool IsTrue
    {
        get { return this.isTrue; }
        set { this.RaiseAndSetIfChanged(x => x.isTrue, ref this.isTrue, value); }
    }

    public IObservable<Unit> Data
    {
        get { return this.data; }
    }

    public ReactiveCollection MyCol
    {
       get { return Mycol; }
    }    
}

public class MyVM : ReactiveObject
{
    MyVM
    {
       // do WhenAny or Observable.Merge here....
    }
}

我想观察上述属性AnotherVM类使用Observable.Merge(..) or WhenAny(...) in MyVM班级。我发现当我订阅上述内容时并不总是收到通知MyVM using WhenAny(...) or Merge(...)当这 3 个属性中的任何一个发生变化时。


WhenAny不是用于跨任意可观察值集进行监视,而是用于监视 ReactiveUI 支持的对象的属性(例如 ReactiveObject 或反应式集合)。

对于组合可观察流中的变化的一般情况,Observable.Merge是正确的方法。

EDIT

我注意到您已将 Data 和 MyCol 属性声明为只读。如果您使用Merge像这样:

Observerable.Merge(this.WhenAnyValue(o=>o.IsTrue, v=>Unit.Default),
                   this.Data,
                   this.MyCol.CollectionChanged.Select(v=>Unit.Default))

...那么您必须小心不要更改支持字段。如果你这样做,那么你会丢失事件 - 也许这就是正在发生的事情?

在这种情况下,您需要将这些属性连接到RaiseAndSetIfChanged并使用Switch跟踪 - 例如如果this.data可以更改然后您需要(我在这里使用 ReactiveUI 5 + .NET 4.5,以防 RaiseAndSetIfChanged 语法看起来很奇怪):

public IObservable<Unit> Data
{
    get { return this.data; }
    private set { this.RaiseAndSetIfChanged(ref data, value); }
}

你的合并将是这样的:

Observerable.Merge(this.WhenAnyValue(o=>o.IsTrue, v=>Unit.Default),
                   this.WhenAnyObservable(x => x.Data),
                   this.MyCol.CollectionChanged.Select(v=>Unit.Default))

WhenAnyObservable 在概念上等价于:

WhenAny(x => x.Data, vm => vm.Value).Switch()

使用 Switch 翻转到最新值Data当它改变时。不要忘记使用设置器来更改数据值!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ReactiveUI 中使用 WhenAny(...) 合并多个可观察值? 的相关文章

随机推荐

  • Android AsyncTask 与进度对话框取消

    在我的android应用程序中 我使用带有进度对话框的AsyncTask 请等待登录 来使用我的网页 异步任务内的Web服务功能 登录用户 当用户单击设备上的 后退 按钮时 我想关闭进度对话框并取消 AsynTask 我找不到用于中断 As
  • Swift - 从 JSON 响应创建数据模型

    我正在学习 Swift 语言 很高兴听到其他人输入的内容之一是 如何处理来自 JSON 响应的模型 例如 I have User swift model class User NSObject var user token String v
  • 自动分配spring的bean名称以防止名称冲突?

    在Spring应用程序中 如果两个程序员开发两个包 将 Repository注释为相同的类名 Spring将抛出 IllegalStateException 注解指定的bean名称 mybean 代表 bean 类 foobar packa
  • 如何从 URL 方案中获取参数。

    我在我的 iPhone 应用程序中使用 URL 方案 从一个页面将用户切换到 safari 然后从网页单击一个按钮 我将恢复到应用程序 此时 一些参数是由网页传递的 例如 myapp parameter 1 如何从我的应用程序中找到此参数
  • jQuery.ajax -always() 并不总是运行

    我正在使用 jQuery ajax 进行 REST 调用并检索一些 JSON 它按预期工作 但是 当我强制出现错误条件 例如无效 URL 时 always 方法不会触发 如果我设置 crossDomain false 或 dataType
  • Linux 文件 IO - 多线程性能 - 写入不同的文件

    我目前正在开发一个音频录制应用程序 该应用程序从网络获取最多 8 个音频流并将数据保存到磁盘 简化的 现在 每个流都由一个线程处理 gt 同一线程还在磁盘上执行保存工作 这意味着我有 8 个不同的线程在同一磁盘上执行写入操作 每个线程写入不
  • 有没有办法区分应用程序是在登录时由启动服务启动还是由用户启动? [复制]

    这个问题在这里已经有答案了 Cocoa 应用程序可以将自己添加到LSSharedFileList的登录项目列表 这将允许应用程序在用户登录时启动 但是 有没有办法判断用户是启动应用程序还是应用程序在登录时自动启动 这很有用 因为在一种情况下
  • MacOS Mojave 中未找到 ntpdate 命令

    我有一个 Bash 脚本可以更新我的 mac 时间 但自从 Mojave 更新后找不到该命令 ntpdate u time apple com return ntpdate command not found 我哪里出错了 这是重复的 请检
  • 在python中将文件从latin1转换为utf-8的最快方法

    我需要在 python 中将文件从 latin1 转换为 utf 8 的最快方法 文件很大 2G 我正在移动数据库数据 到目前为止我已经 import codecs infile codecs open tmpfile r encoding
  • ED A0 80 ED B0 80 是有效的 UTF-8 字节序列吗?

    java nio charset Charset forName utf8 decode http docs oracle com javase 7 docs api java nio charset Charset html decode
  • Java:方法名称/签名解析是否静态完成(编译时)?

    今天我遇到了一个有趣的问题 我认为这在 Java 中是不可能的 我针对 jgroups 2 6 版本编译了 java 代码 但在运行时使用了 2 12 版本 tomcat Web 应用程序部署 我收到以下错误 org jgroups Mes
  • 使 HTA 文件以管理员身份运行(提升)

    在 wsf vbs 和 js 文件中 您可以轻松地找出它们是否运行提升 如果没有 您可以轻松地制作它们 我为此编写的代码是这样的 EnsureElevatedPrivileges WScript Echo Running elevated
  • 反序列化以在运行时键入

    我正在尝试使用TypeAdapterFactory序列化和反序列化一些客户对象 我想在运行时将所有对象序列化为特定类型 所以给定一个String classpath and a JsonObject object我想将对象反序列化为实例Cl
  • C# - 方法的类型签名与 PInvoke 不兼容

    我正在尝试在 C 2010 中使用 VC 2003 dll 当我从 C 调用 dll 的方法时出现此错误 方法的类型签名与 PInvoke 不兼容 I am returning the structure from VC Code stru
  • longjmp 是如何工作的?

    我需要了解 longjmp 函数是如何工作的 我知道它的作用 但我需要知道它是如何做到的 我试图在 gdb 中禁用代码 但我无法理解一些步骤 代码是 0xb7ead420
  • 设置 boost socket.connect 的超时

    我在用boost asio connect on a tcp socket 当一切顺利时 connect立即返回 但在网络较差的情况下 connect日志等待 15 秒后超时 我不能等那么久 所以想减少超时 不幸的是 到目前为止我还没有找到
  • 将 Shell 脚本转换为 *.app 文件

    使用 Automator app 和 Platypus app 我已经能够捆绑我创建的一个简单的 shell 脚本 以在 MacBook Pro 上重新启动 wi fi 生成的两个应用程序都可以正常运行 但有一个我想纠正的明显问题 应用程序
  • DBIx::Class 包装/重载列访问器

    使用 DBIx Class 我试图在更新或检索列的数据时对其进行操作 例如 在它进入数据库之前我想对其进行加密 并且每当它被访问时我想对其进行解密 我正在遵循这个例子DBIx 类 手册 食谱 https metacpan org modul
  • C++:当在函数内创建新对象并将其作为结果返回时,我必须使用 new 运算符来创建对象吗?

    我有两个虚拟问题让我困惑了一段时间 我确实在网上做了一些搜索并阅读了很多 C 教程 但是我找不到具体的答案 假设我们有一个名为 Node 的类 它是单链表的构建块 class Node int data Node next 事实1 局部变量
  • 如何在 ReactiveUI 中使用 WhenAny(...) 合并多个可观察值?

    我有一个问题 它是本网站上提出的以下问题的延伸 当返回类型不重要时 是否有更优雅的方法来合并可观察量 https stackoverflow com questions 8010372 is there a more elegant way