0

所以我尝试将 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
    // ]

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

4

1 回答 1

1

好的,我几天后解决了

原来我使用了错误的类型。根据我的理解,可观察类型实际上似乎仅限于在内部运行一个方法,而不是将订阅者分发到其他任何地方。但是,在进一步阅读文档后,我发现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
于 2019-12-13T18:38:07.810 回答