ReactiveCocoa 可以与纯 c++ ViewModel 一起使用吗?
Can ReactiveCocoa be used with pure c++ ViewModels?
动机是跨平台(Android,Windows Phone(共享视图模型。
例如,考虑:
RAC(self.nameField,text) = RACObserve(self.viewModel, playerName);
如果self.viewModel
是纯C++(11(呢?
显然C++没有属性,但也许它可以以某种方式工作?或者ReactiveCocoa在两端都耦合到Objective-C(当然在UI端耦合没什么大不了的,因为无论如何都必须为相关环境使用其他绑定机制(。
显然C++没有属性,但也许它可以以某种方式工作?
将C++对象包装在 Objective-C 包装器中。
或者ReactiveCocoa在两端都耦合到Objective-C(当然在UI端耦合没什么大不了的,因为无论如何都必须为相关环境使用其他绑定机制(。
ReactiveCocoa 中有一些特定于 UI 的 UI 和 AppKit 扩展,但库的核心根本不依赖于或了解"UI 端",但 ReactiveCocoa 2.x 中的大多数功能都依赖于 Objective-C 对象中的运行时功能。
RACObserve()
只是一个最终调用-[NSObject rac_observeKeyPath:options:observer:block:]
的方法的宏,它本身使用一种称为键值观察的特定于Objective-C的技术。C++对象不支持开箱即用的 KVO,因此它们不能开箱即用 RACObserve()
.
ReactiveCocoa依赖于观察者模式的Cocoa风格实现,而观察者模式又依赖于Objective-C的动态调度性质。
在 Cocoa 中,观察者通过执行类的 isa 切换(将类指针重新分配给运行时生成的子类(来工作。子类重写 setter 方法,以便在属性更改时通知观察者的关联引用。
由于C++使用静态/vtable风格的调度,因此不支持这种方法拦截风格。因此,反应性可可观察者将不起作用。所以答案基本上是否定的,ReactiveCocoa 不适用于纯C++类,尽管可以应用基本原则,或者你可能会寻找一个 Rx 库来C++。
有趣的是,Swift 也默认为静态/vtable dispatch(尽管如果您扩展 NSObject 或使用 @objc 装饰,则支持动态调度(。这里有一篇文章描述了 Swift 的另一种观察者风格。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- ReactiveCocoa 可以与纯 c++ ViewModel 一起使用吗?