ReactiveX(rx)-将可观察对象应用于对象,而不是在可观察对象内部创建对象

问题描述 投票:0回答:1

因此,我已经尝试将ReactiveX理解为库已有一段时间了,我相信我已经开始掌握基本原理了,但是,有一个问题我无法在其中找到解决方案文档...

tldr:我想将一个可观察对象连接到一个类,而无需实际在可观察lambda中创建类,或者在可观察对象内部创建该类,但随后能够提取该类。最后,我想要做的就是以某种方式或形式使一个可观察的类成为一个可观察对象,然后能够在可观察对象的范围之外使用该类。

情况:我分为三层,分别是A,B和C类,其中A持有所有B,后来所有B持有多个C。类B和C都可以存在于多个实例中(A始终只是一个实例)。

问题:因此,在我的应用程序中,类A将创建C的实例,并使用Rx使其可观察。当C实例化并准备就绪时,我想上课并将其传递给B实例之一。但是,我的问题是,由于需要在可观察的create方法中的lambda中创建C类,因此我实际上无法对新的C类做任何事情,因此它仅存在于lambda范围内。因此,我想做的就是将C的引用传递给可观察的对象,并将其提供给订阅者,或者以某种方式从可观察的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个回答
0
投票

好几天后我解决了

原来我使用了错误的类型。根据我的理解,似乎可观察类型实际上仅限于在内部运行方法,而不能在其他任何地方分发用户。但是,在进一步阅读文档后,我发现类型rx::subjects::subject<T>正是我想要的。一个主题可以根据需要生成多个可观察对象和订阅者,这使得获取订阅者并将其传递给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
© www.soinside.com 2019 - 2024. All rights reserved.