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

时间:2014-07-20 12:59:02

标签: c++ objective-c reactive-cocoa

动机是跨平台(Android,Windows Phone)共享视图模型。

例如,考虑:

RAC(self.nameField,text) = RACObserve(self.viewModel, playerName);

如果self.viewModel是纯C ++(11)怎么办?

显然,C ++没有属性,但也许它可以以某种方式工作?或者ReactiveCocoa是双方都与Objective-C耦合的(自然地在UI端耦合也没什么大不了的,因为其他一些绑定机制必须用于相关环境)。

2 个答案:

答案 0 :(得分:3)

  

显然C ++没有属性,但也许它可以以某种方式工作?

将您的C ++对象包装在Objective-C包装器中。

  

或者ReactiveCocoa双方都与Objective-C耦合(自然地在UI端耦合并不是什么大问题,因为其他一些绑定机制必须用于相关环境)。

在ReactiveCocoa中有一些针对UIKit和AppKit的特定于UI的扩展,但是库的核心根本不依赖于“UI端”或者知道它,但ReactiveCocoa 2.x中的大部分功能都依赖于Objective-C对象中的运行时功能。

RACObserve()只是最终调用-[NSObject rac_observeKeyPath:options:observer:block:]的方法的宏,它本身使用名为Key Value Observing的特定于Objective-C的技术。 C ++对象不支持开箱即用的KVO,因此它们不能与RACObserve()一起使用。

答案 1 :(得分:2)

ReactiveCocoa依赖于观察者模式的Cocoa样式实现,而后者又依赖于Objective-C的动态分派特性。

在Cocoa中,观察者通过执行类的isa-swizzling来工作(将类指针重新分配给运行时生成的子类。子类重写setter方法,以在属性更改时通知相关的观察者引用。

由于C ++使用静态/ vtable样式的分派,因此不支持这种方法拦截。因此ReactiveCocoa观察者将无法工作。所以答案基本上没有,ReactiveCocoa不适用于纯C ++类,虽然可以应用基本原则,或者你可能会为C ++寻找一个Rx库。

有趣的是,Swift也默认为static / vtable dispatch(如果扩展NSObject或使用@objc装饰,则支持动态调度)。这是一个n article describing another style of observer for Swift