所以我试图将 ReactiveX 理解为一个库已经有一段时间了,我相信我开始掌握基础知识,但是,我有一个问题,我在文档中找不到解决方案......
tldr:我想要么将可观察量连接到类,而不实际在可观察的 lambda 中创建类,要么在可观察量中创建类,然后能够提取类。最后,我想要的只是以某种方式或形式创建一个类的可观察量,然后能够在可观察量的范围之外使用该类。
情况:我有三层类,我有A,B和C类,其中A在所有B中都成立,后来所有B都成立,在多个C中成立。类 B 和 C 都可以存在于多个实例中(A 始终只有一个实例(。
问题:所以在我的应用程序中,类 A 将创建一个 C 实例,并使用 Rx 使其可观察。当 C 实例化并准备就绪时,我想获取该类并将其传递给其中一个 B 实例。但是,我的问题是,由于我需要在可观察的创建方法中的 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
// ]
是否有其他方法可以完成我想要的,或者我只是误解了这里某事的概念?
好的,几天后我解决了它
原来我用错了类型。根据我的理解,似乎可观察类型实际上仅限于在内部运行方法,而不将订阅者分发到其他任何地方。但是,在进一步阅读文档中后,我找到了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