动机是跨平台(Android,Windows Phone)共享视图模型。
例如,考虑:
RAC(self.nameField,text) = RACObserve(self.viewModel, playerName);
如果self.viewModel
是纯C ++(11)怎么办?
显然,C ++没有属性,但也许它可以以某种方式工作?或者ReactiveCocoa是双方都与Objective-C耦合的(自然地在UI端耦合也没什么大不了的,因为其他一些绑定机制必须用于相关环境)。
答案 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。