【问题标题】:ReactiveX (rx) - Apply observable on object rather than creating object inside observableReactiveX (rx) - 在对象上应用 observable 而不是在 observable 中创建对象
【发布时间】:2019-12-05 20:41:09
【问题描述】:

所以我已经尝试将 ReactiveX 理解为一个库有一段时间了,我相信我已经开始掌握基础知识了,但是,我遇到了一个问题,我找不到解决方案在文档中...

tldr: 我想将一个可观察对象连接到一个类,而无需在可观察 lambda 中实际创建该类,或者,在可观察对象中创建该类,然后能够提取该类。最后,我只想以某种方式或形式制作一个类的可观察对象,然后能够在可观察对象范围之外使用该类。

情况: 我有三层类,我有 A、B 和 C 类,其中 A 包含在所有 B 中,后来所有 B 包含在多个 C 中。 B 类和 C 类都可能存在于多个实例中(A 总是只有一个实例)。

问题: 所以在我的应用程序中,A 类将创建 C 的一个实例,并使用 Rx 使其可观察。当 C 被实例化并准备好时,我想获取该类并将其传递给 B 实例之一。但是,我的问题是,由于我需要在 observable create 方法中的 lambda 中创建 C 类,因此我实际上无法对新的 C 类做任何事情,它只存在于 lambda 范围内。所以我想要做的是将 C 的引用传递给 observable 并将其提供给订阅者,或者以某种方式从 observable lambda 中返回 C 实例。我尝试给 lambda 一个指向我的类的指针并使 lambda 可变,但是这样做时 rx 给了我编译错误并抱怨 Rx 方法是 const。

    const auto test = rx::observable<>::create<something>([&](rx::subscriber<something> subscriber) {
        C c(subscriber);
    });
    // Here I want to access c

我尝试像这样传递它但没有成功

    class C {
        C(rx::subscriber<someting> subscriber) {
            subscriber.on_next(55);
        }
    };

    C* c = nullptr;
    const auto test = rx::observable<>::create<something>([cLambda = c](rx::subscriber<something> subscriber) mutable {
        cLambda = new C(subscriber);
    });

    test.subscribe([](something input) {
        std::cout << "Called " << input<< std::endl;
    });
    // Compile error: C3848: expression having type 'const main::<lambda_d3f00...>' would lose some const-volatile qualifiers in order to call 'void main::<lambda_d3f00...>::operator ()(rxcpp::subscriber<something,rxcpp::observer<T,void,void,void,void>>)'
    // with
    // [
    //     T=container
    // ]

是否存在任何其他方法来完成我想要的,或者我只是误解了这里的某些东西的概念?

【问题讨论】:

    标签: c++ system.reactive reactivex rxcpp


    【解决方案1】:

    好的,我几天后解决了

    原来我使用了错误的类型。据我了解,可观察类型实际上似乎仅限于在内部运行一个方法,而不是将订阅者分发到其他任何地方。但是,在进一步阅读文档后,我发现 rx::subjects::subject&lt;T&gt; 类型正是我想要的。一个主题可以根据需要生成多个可观察对象和订阅者,这使得获取订阅者并将其传递给 C 类成为可能。

    这是工作代码:

    rx::subjects::subject<something> cSubject;
    auto subscriber = cSubject.get_subscriber();
    auto observable = cSubject.get_observable();
    
    // Give C an Emiter/subscriber
    C* c = new C(&subscriber);
    
    // Listener
    observable.subscribe([](something var) {
        std::cout << "I was called!!!" << std::endl;
    });
    
    // Now I can call c.doStuff() and trigger the listener from there
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多