ReactiveCocoa 可以与纯 c++ ViewModel 一起使用吗?

Can ReactiveCocoa be used with pure c++ ViewModels?

本文关键字:一起 ViewModel c++ ReactiveCocoa      更新时间:2023-10-16

动机是跨平台(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 的另一种观察者风格。