ReactiveX (rx) - 在对象上应用 observable 而不是在 observable 内部创建对象
ReactiveX (rx) - Apply observable on object rather than creating object inside observable
所以我已经尝试将 ReactiveX 理解为一个库已有一段时间了,我相信我开始掌握基础知识,但是,我遇到了一个问题,我找不到文档中的解决方案...
tldr: 我想将可观察对象连接到 class 而无需在可观察对象 lambda 中实际创建 class 或创建 class inside the observable 但随后能够提取 class。最后我想做的就是以某种方式或形式制作一个 class 的可观察对象,然后能够在可观察对象的范围之外使用 class。
情况:
我有三层 classes,我有 class A、B 和 C,其中 A 包含所有 B,后来所有 B 包含多个 C。 classes B和C都可能存在于多个实例中(A总是只有一个实例)。
问题:
所以在我的应用程序中,class A 将创建 C 的实例,并使用 Rx 使其可观察。当 C 被实例化并准备就绪时,我想获取 class 并将其传递给 B 实例之一。但是,我的问题是,由于我需要在可观察的创建方法中的 lambda 中创建 C class,因此我实际上无法对新的 C Class 执行任何操作,它仅存在于 lambda 范围内.所以我想做的是将 C 的引用传递给可观察对象并给它订阅者,或者以某种方式 return 从可观察的 lambda 中取出 C 实例。我尝试给 lambda 一个指向我的 class 的指针并使 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 class.
成为可能
这是工作代码:
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
所以我已经尝试将 ReactiveX 理解为一个库已有一段时间了,我相信我开始掌握基础知识,但是,我遇到了一个问题,我找不到文档中的解决方案...
tldr: 我想将可观察对象连接到 class 而无需在可观察对象 lambda 中实际创建 class 或创建 class inside the observable 但随后能够提取 class。最后我想做的就是以某种方式或形式制作一个 class 的可观察对象,然后能够在可观察对象的范围之外使用 class。
情况: 我有三层 classes,我有 class A、B 和 C,其中 A 包含所有 B,后来所有 B 包含多个 C。 classes B和C都可能存在于多个实例中(A总是只有一个实例)。
问题: 所以在我的应用程序中,class A 将创建 C 的实例,并使用 Rx 使其可观察。当 C 被实例化并准备就绪时,我想获取 class 并将其传递给 B 实例之一。但是,我的问题是,由于我需要在可观察的创建方法中的 lambda 中创建 C class,因此我实际上无法对新的 C Class 执行任何操作,它仅存在于 lambda 范围内.所以我想做的是将 C 的引用传递给可观察对象并给它订阅者,或者以某种方式 return 从可观察的 lambda 中取出 C 实例。我尝试给 lambda 一个指向我的 class 的指针并使 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 class.
这是工作代码:
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