ReactiveCocoa vs RxSwift-장단점?


256

이제 ReactiveCocoa 사람들은 신속하게 버전 3.0에서 신속하게 다시 작성했습니다.

또한 RxSwift 라는 또 다른 프로젝트가 진행되었습니다 .

사람들이 두 프레임 워크의 디자인 / api / 철학의 차이점이 무엇인지에 대한 정보를 추가 할 수 있는지 궁금합니다.

[StackOverflow mods에 대한 참고 사항 :이 질문에는 명확한 답변이 있습니다. 그 대답은 두 프레임 워크의 차이점입니다. SO에 대한 주제이기도합니다.]

시작하기 위해, 그들의 ReadMe를 읽었을 때의 첫 인상은 다음과 같습니다.

  • Microsoft의 "실제"C # Rx에 익숙한 사람인 RxSwift는 훨씬 더 잘 보입니다.
  • ReactiveCococa는 현재 자체 공간으로 이동하여 Signals vs SignalProducers 및 Lifting과 같은 새로운 추상화를 도입했습니다. 한편으로 이것은 일부 상황 (핫 vs 콜드 신호)을 명확히하는 것처럼 보이지만 다른 한편으로는 프레임 워크의 복잡성을 증가시키는 것으로 보입니다. 많은

귀하의 질문은 구체적으로 "의견"을 요구합니다. 다시 말씀해 주시겠습니까? 그러면 기꺼이 투표권을 철회하겠습니다.
Sulthan

2
차이점은 사실이 아니라 사실이기 때문에 "의견 추가"를 제거 할 수 있습니다. 그런 다음 RAC / RxSwift의 일부 기능을 좋아하거나 싫어할 수 있지만 차이점은 분명합니다.
bontoJR

1
하하, "mod to mods"에 관한 좋은 움직임!
ming yeow

1
질문 이름 바꾸기 : ReactiveCocoa와 RxSwift의 차이점. 모든 것이 "사실"이 될 것이라고 생각하며이 질문은 레거시입니다.
hqt

1
해결책은 "이것은 매우 좋은 질문입니다"로 시작합니다. : |
Iulian Onofrei

답변:


419

이것은 매우 좋은 질문입니다. 두 세계를 비교하는 것은 매우 어렵습니다. Rx는 Reactive Extensions가 C #, Java 또는 JS와 같은 다른 언어로 된 포트입니다.

Reactive Cocoa는 Functional Reactive Programming 에서 영감을 받았지만 지난 몇 개월 동안 Reactive Extensions 에서도 영감을 받았습니다 . 결과는 Rx와 일부 정보를 공유하지만 FRP에서 유래 한 이름을 가진 프레임 워크입니다.

가장 먼저 할 말은 개념 Conal 정의 에 따라 RAC와 RxSwift가 Functional Reactive Programming 구현 이 아니라는 것 입니다. 이 시점부터 모든 프레임 워크가 부작용과 몇 가지 다른 구성 요소를 처리하는 방식으로 모든 것을 줄일 수 있습니다.

커뮤니티와 메타 기술 에 대해 이야기 해 봅시다 .

  • RAC는 Objective-C에서 진행중인 작업을 완전히 중단 한 후 3.0 릴리스 용 Swift (브리지 포함)로 이식 된 Objective-C에서 태어난 3 년 된 프로젝트입니다.
  • RxSwift는 몇 달 전의 프로젝트이며 현재 커뮤니티에서 추진력이있는 것 같습니다. RxSwift에서 중요한 한 가지는 ReactiveX 조직 아래에 있으며 다른 모든 구현은 동일한 방식으로 작동한다는 것입니다. RxSwift를 처리하는 방법을 배우면 Rx.Net, RxJava 또는 RxJS를 사용하는 것이 간단한 작업이자 문제입니다. 언어 구문 나는 그것이 한 번만 배운 철학에 근거한다고 말할 수 있고 , 어디에나 적용 할 수 있습니다 .

이제 기술적 인 시간이다.

엔티티 생성 / 관찰

RAC 3.0 2 개 주 요소를 가지며, Signal그리고 SignalProducer, 첫 번째 이벤트가없이 가입자가 장착되지 않았거나 출판, 두번째는 필요한 start실제로 제조 신호 / 이벤트를 갖는 것. 이 디자인은 많은 개발자들에게 혼란의 원인이 된 지루한 뜨겁고 차가운 관측 가능 개념을 분리하기 위해 만들어졌습니다. 이것이 차이점을 부작용 관리 방법으로 줄일 수있는 이유 입니다.

RxSwift에서, Signal그리고 SignalProducer로 변환 Observable, 그것은 혼란 소리 수 있지만,이 두 기관은 실제로 수신 세계에서 같은 일이다. ObservableRxSwift에서 s를 사용 하는 디자인 은 뜨겁거나 차갑지 않은지를 고려하여 생성해야합니다. 불필요한 복잡한 것처럼 들릴 수 있지만 일단 작동 방식을 이해하면 가입 및 관찰 중에 뜨거운 / 차가운 / 따뜻한 부작용이 발생합니다. ) 길들일 수 있습니다.

두 세계에서 구독 개념은 기본적으로 동일하며, RAC가 도입 한 것과는 약간의 차이가 있으며 완료 이벤트가 전송되기 전에 interruptiona Signal가 폐기 될 때 의 이벤트 입니다. 두 가지 모두를 요약하면 다음과 같은 종류의 이벤트가 있습니다.

  • Next, 새로운 수신 값을 계산하기 위해
  • Error, 모든 관찰자를 구독 취소하여 오류를 계산하고 스트림을 완료합니다.
  • Complete모든 관찰자를 구독 취소하여 스트림을 완료된 것으로 표시

또한 RAC는 올바르게 완료되거나 오류가 발생하기 전에 interrupteda Signal가 폐기 될 때 전송됩니다 .

수동 작성

RAC에서 Signal/ SignalProducer는 읽기 전용 엔터티이며 외부에서 관리 할 수 ​​없으며 ObservableRxSwift 와 동일 합니다. Signal/ SignalProducer를 쓰기 가능한 엔터티로 바꾸려면 이 pipe()기능을 사용하여 수동으로 제어되는 항목을 반환해야합니다. Rx 공간에서 이것은 다른 유형 Subject입니다.

읽기 / 쓰기 개념이 생소하게 들리면 Future/ 와의 훌륭한 비유가 Promise가능합니다. A는 Future같은 읽기 전용 자리 표시 자입니다 Signal/ SignalProducer그리고 Observable다른 한편으로는, Promise대한처럼 수동으로 성취 될 수있다 pipe()Subject.

스케줄러

이 엔터티는 동일한 개념으로 두 세계에서 거의 비슷하지만 RAC는 직렬 전용이며 RxSwift 기능은 동시 스케줄러도 있습니다.

구성

컴포지션은 리 액티브 프로그래밍의 핵심 기능입니다. 스트림 구성은 두 프레임 워크의 본질이며 RxSwift에서는 시퀀스 라고도 합니다 .

RxSwift의 모든 관찰 엔티티 유형입니다 ObservableType우리의 인스턴스 구성 있도록, Subject그리고 Observable여분의 걱정없이, 같은 연산자를.

RAC 공간에, Signal그리고 SignalProducer2 개의 다른 엔티티이며에 우리는이 liftSignalProducer의 인스턴스 생성되는 것을 구성 할 수 있도록 Signal. 두 엔터티에는 자체 연산자가 있으므로 혼합해야 할 경우 특정 연산자를 사용할 수 있는지 확인해야하며 다른 쪽에서는 고온 / 감기 관측 가능 항목을 잊어 버리십시오.

이 부분에 대해 Colin Eberhardt는 다음과 같이 훌륭하게 요약했습니다.

현재 API를 살펴보면 신호 작업은 주로 '다음'이벤트에 중점을 두어 다른 스레드에서 값을 변환, 건너 뛰기, 지연, 결합 및 관찰 할 수 있습니다. 신호 생성기 API는 대부분 flatMap, takeUntil 및 catch와 같은 작업을 통해 신호 수명주기 이벤트 (완료, 오류)와 관련이 있습니다.

특별한

RAC도의 개념을 갖는다 ActionProperty값이 변경되면 태스크를 수행하기 위해 값을 관찰 할 때, 후자는 흥미, 전자는 주로 사용자 상호 작용과 관련된, 컴퓨팅 부작용 유형이다. RxSwift에서는 Action로 다시 번역되며 Observable, 이는 RxCocoaiOS와 Mac 용 Rx 프리미티브의 통합에 잘 나와 있습니다. RAC 는 RxSwift에서 (또는 ) Property으로 번역 될 수 있습니다 .VariableBehaviourSubject

Property/ Variable가 우리가 명령형 세계를 반응성 프로그래밍의 선언적 특성에 연결해야하는 방식 이라는 것을 이해하는 것이 중요 하므로, 때로는 타사 라이브러리 또는 iOS / Mac 공간의 핵심 기능을 다룰 때 기본 구성 요소가됩니다.

결론

RAC와 RxSwift는 완전히 다른 2 마리의 짐승입니다. 전자는 코코아 공간에서 오랜 역사를 가지고 있으며 많은 공헌자 들이며, 후자는 상당히 어리지만 Java, JS 또는 .그물. 더 나은 결정은 선호에 있습니다. RAC는 핫 / 콜드 관측 가능 분리가 필수적이며 이것이 프레임 워크의 핵심 기능이라고 말합니다 .RxSwift는 통합이 분리보다 낫다고 다시 말하지만 부작용은 어떻게 관리 / 수행되는지에 관한 것입니다.

RAC 3.0은 중단 개념, 두 개체간에 연산자 분리 및 start신호 생성을 시작하는 것과 같은 일부 필수 동작을 도입하는 등 핫 / 콜드 관측 가능 항목 분리라는 주요 목표 위에 예기치 않은 복잡성을 야기한 것으로 보입니다 . 어떤 사람들에게는 이런 것들이 좋거나 살인자 기능 일 수도 있고, 어떤 사람들에게는 불필요하거나 위험 할 수도 있습니다. 기억해야 할 또 다른 점은 RAC는 경험이 풍부한 코코아 데브이다 만약 그렇다면, 당신은 가능한 한 코코아 규칙을 유지하기 위해 노력하고있다 한다 그것보다는 RxSwift와 작업에 더 편안한 느낌.

반면 RxSwift는 핫 / 콜드 옵저버 블과 같은 모든 단점뿐만 아니라 Reactive Extensions의 장점도 있습니다. RxJS, RxJava 또는 Rx.Net에서 RxSwift로 이동하는 것은 간단한 것입니다. 모든 개념은 동일하므로 재료를 찾는 것이 매우 흥미로울 수 있습니다. 현재 직면하고있는 동일한 문제 일 수도 있습니다 .RxJava 및 솔루션의 누군가가 해결했습니다. 플랫폼을 고려하여 다시 적용 할 수 있습니다.

어느 것을 선택해야하는지는 분명한 선호의 문제이며, 객관적인 관점에서 어느 것이 더 나은지 알 수는 없습니다. 유일한 방법은 Xcode를 실행하고 두 가지 모두를 시도하고 작업하기가 더 편한 것을 선택하는 것입니다. 소프트웨어 개발 단순화라는 동일한 목표를 달성하려는 두 가지 유사한 개념을 구현 한 것입니다.


24
@ junior-b에 대한 훌륭한 설명입니다! 또한 언급 할만큼 가치입니다, 그러나 (오류 감사의 부족을 포함하는 RAC의 인코딩 유형 정보 NoError스트림 유형 자체) : Signal<T, E: ErrorType>Observable<T>. 핫 / 콜드 분리뿐만 아니라 컴파일 시간에 필요없는 정보를 대량으로 제공합니다 RxSwift.
NachoSoto

3
@nachosoto 님 안녕하세요, 친절한 말씀 감사합니다. 제안 된 추가 기능이 Reactive Programming과 비교할 때 적합하지 않다고 생각합니다. RAC 측면에서 분명히 좋은 추가 사항이지만 RP는 데이터 흐름 프로그래밍을 단순화하는 데 있으며 중요한 요소는 오류 처리, 비동기 계산, 부작용 관리 및 구성입니다. 개발자 관점에서 볼 때 이것은 멋진 기능으로 보입니다. 이것은 코드의 오류 유형을 명확하게하기위한 것입니다. 프레임 워크의 오류 처리 측면을 실제로 개선하지는 않습니다. 물론 내 겸손한 의견입니다.
bontoJR

3
현재로서는 RAC에 대한 훌륭한 자습서가 부족하지만 RxSwift에 대한 훌륭한 샘플 프로젝트가 있다는 것이 언급 할 가치가 있습니다.
Vadim Bulavin

1
ReactiveCocoa는 Error와 일반적인 자유 함수 SignalProducer를 도입 할 때까지 훌륭했습니다. 나는 RxKotlin 작업 할 때 RxSwift와 내가 같은 경험을 얻을 RxJS 내용
onmyway133
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.