Цель c — Можно ли использовать ReactiveCocoa с чистыми моделями представления c ++?

Мотивация — совместное использование моделей представлений на разных платформах (Android, Windows Phone).

Например, рассмотрим:

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

Что, если self.viewModel такое чистый C ++ (11)?

Очевидно, что C ++ не имеет свойств, но, возможно, его можно как-то заставить работать? Или ReactiveCocoa связан с Objective-C с обеих сторон (естественно, что связывание на стороне пользовательского интерфейса не представляет особой проблемы, поскольку для соответствующей среды необходимо использовать какой-либо другой механизм связывания).

2

Решение

Очевидно, что 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(),

3

Другие решения

ReactiveCocoa опирается на реализацию шаблона наблюдателя в стиле Какао, который, в свою очередь, опирается на динамическую диспетчеризацию Objective-C.

В Какао наблюдатели работают, выполняя isa-swizzling класса (переназначая указатель класса на сгенерированный подкласс во время выполнения. Подкласс переопределяет метод установки, чтобы уведомить связанную ссылку наблюдателей, когда свойство изменяется.

Поскольку C ++ использует статический / vtable стиль диспетчеризации, этот стиль перехвата методов не поддерживается. Поэтому наблюдатели ReactiveCocoa не будут работать. Таким образом, по сути, ответ отрицательный: ReactiveCocoa не будет работать для чистых классов C ++, хотя могут быть применены основополагающие принципы или вы можете искать библиотеку Rx для C ++.

Интересно, что Swift по умолчанию также использует статическую / виртуальную диспетчеризацию (хотя поддерживает динамическую диспетчеризацию, если вы расширяете NSObject или используете декорацию @objc). Вотn статья, описывающая другой стиль наблюдателя для Swift.

2

По вопросам рекламы [email protected]