ReactiveCocoa vs RxSwift-плюсы и минусы?



Итак, теперь со Свифтом,ReactiveCocoa люди переписали его в версии 3.0 для swift



кроме того, был еще один проект под названием RxSwift.



интересно, могут ли люди добавить информацию о том, какие различия в дизайне / api / философии двух фреймворков (пожалуйста, в духе SO, придерживайтесь вещей, которые являются истинными, а не мнения о том, что является "лучшим")



[Примечание для модов StackOverflow: На этот вопрос есть окончательные ответы, ответ заключается в различиях между двумя рамками. Я думаю, что это также очень по теме для SO]



для начала, мое первое впечатление от чтения их ReadMe является:




  • как кто-то, кто знаком с "реальным" C# Rx от microsoft, RxSwift выглядит намного более узнаваемым.

  • ReactiveCococa, похоже, ушел в свое собственное пространство сейчас, вводя новые абстракции, такие как сигналы vs Сигнальщики и подъемники. С одной стороны, это, кажется, проясняет некоторые ситуации (что такое горячий и холодный сигнал), но с другой стороны, это, похоже, значительно увеличивает сложность фреймворка

657   1  

1 ответ:

это очень хороший вопрос. Сравнивать два мира очень трудно. Rx-это порт того, что реактивные расширения находятся в других языках, таких как C#, Java или JS.

реактивное какао было вдохновлено Функциональное Реактивное Программирование, но в последние месяцы, было также указано как вдохновленный реактивными расширениями как хорошо. Результатом является структура, которая разделяет некоторые вещи с Rx, но имеет имена с происхождением в FRP.

первый дело в том, что ни RAC, ни RxSwift не являются Функциональное Реактивное Программирование реализации, по данным сфероконические это концепции. С этого момента все можно свести к тому, как каждая структура обрабатывает побочные эффекты и несколько других компонентов.

давайте поговорим о сообществе и meta-tech материал:

  • RAC-это 3-летний проект, родившийся в Objective-C позже портированный на Swift (с мосты) для версии 3.0, После полного отказа от текущей работы над Objective-C.
  • RxSwift-это проект, которому уже несколько месяцев, и, похоже, у него есть импульс в сообществе прямо сейчас. Одна вещь, которая важна для RxSwift является то, что находится под ReactiveX организация и что все другие реализации работают таким же образом, изучение того, как иметь дело с RxSwift сделает работу с Rx.Net, RxJava или RxJS простая задача и просто вопрос синтаксиса языка. Я мог бы сказать, что это основано на философии учитесь один раз, применяйте везде.

теперь пришло время для технического персонала.

Создание / Наблюдение Сущностей

RAC 3.0 имеет 2 основных объекта,Signal и SignalProducer, первый публикует события независимо от того, подключен абонент или нет, второй требует start к фактически иметь произведенные сигналы / события. Эта конструкция была создана для того чтобы отделить нудную принципиальную схему горячего и холодные наблюдаемые, что было источником путаницы для многих разработчиков. Вот почему различия могут быть сведены к тому, как они управляют побочными эффектами.

В RxSwift,Signal и SignalProducer переводится как Observable, это может показаться запутанным, но эти 2 сущности на самом деле то же самое в мире Rx. Дизайн с Observables в RxSwift должен быть создан с учетом того, если они горячие или холодные, это может звучать как ненужная сложность, но как только вы поняли как они работают (и снова горячий/холодный/теплый-это только побочные эффекты при подписке/наблюдении), их можно приручить.

в обоих мирах концепция подписки в основном одинакова, есть одна небольшая разница, которую ввел RAC и является interruption событие, когда Signal удаляется до отправки события завершения. Чтобы резюмировать оба имеют следующие виды событий:

  • Next, чтобы вычислить новый полученный значение
  • Error, вычислить ошибку и завершить поток, отписавшись от всех наблюдателей
  • Complete, чтобы отметить поток как завершенный отписка всех наблюдателей

RAC в дополнение имеет interrupted это отправляется, когда a Signal утилизируется до завершения либо правильно, либо с ошибкой.

Вручную Писать!--80-->

в RAC,Signal/SignalProducer являются объектами только для чтения, ими нельзя управлять извне, то же самое для Observable в RxSwift. В свою очередь Signal/SignalProducer в записываемый объект, вы должны использовать pipe() функция для возврата элемента с ручным управлением. На пространстве Rx это другой тип, называемый Subject.

если концепция чтения / записи звучит незнакомо, хорошая аналогия с Future/Promise можно сделать. А Future является заполнителем только для чтения, например Signal/SignalProducer и Observable, С другой стороны, a Promise можно выполнить вручную, как для pipe() и Subject.

планировщиков

эта сущность в значительной степени похожа в обоих мирах, одни и те же концепции, но RAC является последовательным, вместо этого RxSwift имеет также параллельные планировщики.

состав

композиция является ключевой особенностью реактивного программирования. Составление потоков является сущностью обоих фреймворков, в RxSwift они также называются последовательности.

все наблюдаемые объекты в RxSwift относятся к типу ObservableType, поэтому мы составляем экземпляры Subject и Observable С теми же операторами, без каких-либо дополнительных беспокойства.

на пространстве RAC,Signal и SignalProducer это 2 разные сущности и мы должны lift on SignalProducer чтобы иметь возможность составить то, что производится с экземплярами Signal. У этих двух объектов есть свои собственные операторы, поэтому, когда вам нужно смешивать вещи, вы должны убедиться, что определенный оператор доступен, с другой стороны, вы забываете о горячем / холодном заметный.

об этой части, Колин Эберхардт подвел итог красиво:

глядя на текущий API, сигнальные операции в основном сосредоточены на событии "next", что позволяет вам преобразовывать значения, пропускать, задерживать, комбинировать и наблюдать за различными потоками. В то время как API-интерфейс производителя сигналов в основном связан с событиями жизненного цикла сигнала( завершено, ошибка), с операциями, включая then, flatMap, takeUntil и поймать.

дополнительно

RAC также имеет понятие Action и Property, первый тип для вычисления побочных эффектов, в основном связанных с взаимодействием с пользователем, последний интересен при наблюдении за значением для выполнения задачи, когда значение изменилось. В RxSwift то Action снова превращается в Observable, это хорошо показано в RxCocoa, интеграция примитивов Rx для iOS и Mac. КДР по Property можно перевести на Variable (или BehaviourSubject) в RxSwift.

важно понимать, что Property/Variable это способ, которым мы должны связать императивный мир с декларативным характером реактивного программирования, поэтому иногда является фундаментальным компонентом при работе с сторонними библиотеками или основными функциональными возможностями пространства iOS/Mac.

вывод

RAC и RxSwift - это 2 полных разных зверя, первый имеет долгую историю в пространстве какао и много вкладчиков, последний довольно молод, но опирается на концепции, которые оказались эффективными в других языках, таких как Java, JS или .NET. решение о том, что лучше, находится на предпочтении. RAC заявляет, что разделение горячего/холодного наблюдаемого было необходимо, и это основная особенность структуры, RxSwift говорит, что объединение их лучше, чем разделение, опять же речь идет о том, как управляются/выполняются побочные эффекты.

RAC 3.0, кажется, ввел некоторые неожиданная сложность поверх основной цели разделения горячих / холодных наблюдаемых, таких как концепция прерывания, разделение операторов между 2 сущностями и введение некоторого императивного поведения, такого как start начать производить сигналы. Для некоторых людей эти вещи могут быть приятной вещью или даже убийственной функцией, для некоторых других они могут быть просто ненужными или даже опасными. Другое дело, чтобы помнить, что RAC пытается идти в ногу с соглашениями какао как можно больше, так что если вы опытный разработчик какао, вы должны чувствовать себя более комфортно работать с ним, а не RxSwift.

RxSwift, с другой стороны, живет со всеми недостатками, такими как горячие/холодные наблюдаемые, но также и хорошие вещи, реактивные расширения. Переезд из RxJS, RxJava или Rx.Net для RxSwift это простая вещь, все концепции одинаковы, поэтому это делает поиск материала довольно интересным, возможно, та же проблема, с которой вы сталкиваетесь сейчас, была решена кем-то в RxJava и решение могут быть повторно применены с учетом платформы.

какой из них должен быть выбран, безусловно, вопрос предпочтения, с объективной точки зрения невозможно сказать, какой из них лучше. Единственный способ-запустить Xcode и попробовать оба из них и выбрать тот, с которым удобнее работать. Они представляют собой 2 реализации схожих концепций, пытаясь достичь одной и той же цели: упрощение разработки программного обеспечения.

Comments

    Ничего не найдено.