ReactiveCocoa vs RxSwift-плюсы и минусы?
Итак, теперь со Свифтом,ReactiveCocoa люди переписали его в версии 3.0 для swift
кроме того, был еще один проект под названием RxSwift.
интересно, могут ли люди добавить информацию о том, какие различия в дизайне / api / философии двух фреймворков (пожалуйста, в духе SO, придерживайтесь вещей, которые являются истинными, а не мнения о том, что является "лучшим")
[Примечание для модов StackOverflow: На этот вопрос есть окончательные ответы, ответ заключается в различиях между двумя рамками. Я думаю, что это также очень по теме для SO]
для начала, мое первое впечатление от чтения их ReadMe является:
- как кто-то, кто знаком с "реальным" C# Rx от microsoft, RxSwift выглядит намного более узнаваемым.
- ReactiveCococa, похоже, ушел в свое собственное пространство сейчас, вводя новые абстракции, такие как сигналы vs Сигнальщики и подъемники. С одной стороны, это, кажется, проясняет некоторые ситуации (что такое горячий и холодный сигнал), но с другой стороны, это, похоже, значительно увеличивает сложность фреймворка
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это отправляется, когда aSignalутилизируется до завершения либо правильно, либо с ошибкой.Вручную Писать!--80-->
в RAC,
Signal/SignalProducerявляются объектами только для чтения, ими нельзя управлять извне, то же самое дляObservableв RxSwift. В свою очередьSignal/SignalProducerв записываемый объект, вы должны использоватьpipe()функция для возврата элемента с ручным управлением. На пространстве Rx это другой тип, называемыйSubject.если концепция чтения / записи звучит незнакомо, хорошая аналогия с
Future/Promiseможно сделать. АFutureявляется заполнителем только для чтения, напримерSignal/SignalProducerиObservable, С другой стороны, aPromiseможно выполнить вручную, как дляpipe()иSubject.планировщиков
эта сущность в значительной степени похожа в обоих мирах, одни и те же концепции, но RAC является последовательным, вместо этого RxSwift имеет также параллельные планировщики.
состав
композиция является ключевой особенностью реактивного программирования. Составление потоков является сущностью обоих фреймворков, в RxSwift они также называются последовательности.
все наблюдаемые объекты в RxSwift относятся к типу
ObservableType, поэтому мы составляем экземплярыSubjectиObservableС теми же операторами, без каких-либо дополнительных беспокойства.на пространстве RAC,
SignalиSignalProducerэто 2 разные сущности и мы должныliftonSignalProducerчтобы иметь возможность составить то, что производится с экземплярами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