Мотивация — совместное использование моделей представлений на разных платформах (Android, Windows Phone).
Например, рассмотрим:
RAC(self.nameField,text) = RACObserve(self.viewModel, playerName);
Что, если self.viewModel
такое чистый C ++ (11)?
Очевидно, что C ++ не имеет свойств, но, возможно, его можно как-то заставить работать? Или ReactiveCocoa связан с Objective-C с обеих сторон (естественно, что связывание на стороне пользовательского интерфейса не представляет особой проблемы, поскольку для соответствующей среды необходимо использовать какой-либо другой механизм связывания).
Очевидно, что C ++ не имеет свойств, но, возможно, его можно как-то заставить работать?
Оберните ваши объекты C ++ в оболочки Objective-C.
Или ReactiveCocoa связан с Objective-C с обеих сторон (естественно, что связывание на стороне пользовательского интерфейса не представляет особой проблемы, поскольку для соответствующей среды необходимо использовать какой-либо другой механизм связывания).
В ReactiveCocoa есть некоторые специфичные для пользовательского интерфейса расширения UIKit и AppKit, но ядро библиотеки вообще не зависит и не знает «сторону пользовательского интерфейса», но большая часть функций в ReactiveCocoa 2.x опирается на функции времени выполнения в Объекты Objective-C.
RACObserve()
это просто макрос для метода, который в конечном итоге вызывает -[NSObject rac_observeKeyPath:options:observer:block:]
, которая сама использует технологию Objective-C под названием Наблюдение за ключевыми значениями. Объекты C ++ не поддерживают KVO из коробки, поэтому они не работают из коробки с RACObserve()
,
ReactiveCocoa опирается на реализацию шаблона наблюдателя в стиле Какао, который, в свою очередь, опирается на динамическую диспетчеризацию Objective-C.
В Какао наблюдатели работают, выполняя isa-swizzling класса (переназначая указатель класса на сгенерированный подкласс во время выполнения. Подкласс переопределяет метод установки, чтобы уведомить связанную ссылку наблюдателей, когда свойство изменяется.
Поскольку C ++ использует статический / vtable стиль диспетчеризации, этот стиль перехвата методов не поддерживается. Поэтому наблюдатели ReactiveCocoa не будут работать. Таким образом, по сути, ответ отрицательный: ReactiveCocoa не будет работать для чистых классов C ++, хотя могут быть применены основополагающие принципы или вы можете искать библиотеку Rx для C ++.
Интересно, что Swift по умолчанию также использует статическую / виртуальную диспетчеризацию (хотя поддерживает динамическую диспетчеризацию, если вы расширяете NSObject или используете декорацию @objc). Вотn статья, описывающая другой стиль наблюдателя для Swift.