본문 바로가기

IOS 개발지식/iOS

[iOS] RxSwift와 Combine

2019년 Apple 에서 발표한 built-in 방식의 combine과

third-party로 기존 UIKit에서 잘 사용된 RxSwift를 알아보려 한다

 

그 전에

combine과 RxSwift 자체 목적은 무엇일까?

둘 다 Reactive Programming (반응형 프로그래밍) 프레임워크이기에 해당 정의부터 살펴봐야겠다,,

 

Reactive Programming

데이터의 흐름변경사항의 전파에 중점을 둔 선언적 프로그래밍 패러다임

(by 영어 위키백과)

 

즉, 시간에 따른 데이터의 변화를 고려한 패러다임으로

시간과 상태 변화에 반응하는 어플리케이션을 관리하도록 한다

 

예를 들어, 서버에서 데이터를 받아온 후 UI 업데이트, 오류 처리 등

여러 작업을 한 번의 스트림으로 연결시켜 코드의 복잡성을 크게 줄인다

 

 

RxSwift의 Observable과 Combine의 Publisher를 개념을 간단히 보고

성능 비교!

 

RxSwift

 

RxSwift는 ReactiveX에서 만든 오픈 소스 반응형 프레임워크로 2015년 최초 Release 이후 현재까지 많이 사용되고 있다

+ Reactive eXtension + Swift의 합성어로 이루어진 용어

Observable과 Observer로 상호작용한다

 

Observable

"관찰할 수 있는" 데이터 형태로 옵저버가 처리할 수 있도록 데이터를 포장하는 작업을 담당한다

즉, subscribe하여 이벤트를 수신할 수 있는 상태

- ObservableConvertibleType,ObservableType 두 프로토콜을 채택한 class

- ObersableType 프로토콜은 subscribe 함수를 제공하여 observer를  생성

 

[생명주기]

1. Create: 생성

2. Subscribe: 구독, observer 생성

3. onNext: 데이터 전달

4. onCompleted / onError: Observable 종료 조건 (정상종료/에러발생) => 재사용 불가

5. Dispose: 소멸

 

[종류]

1. Hot Observable:

Observer 유무에 관계없이 이벤트를 방출하는 Observable

ex. 생방송 (Live Streaming), Timer, Subject, UIEvent

 

- 생방송과 같이 구독 전 방출한 데이터를 볼 수 없다

- 종류:  Publish Subject(Relay)  /  Behavior Subject(Relay)

 

 

2. Cold Observable:

Observer가 구독하기 전까지 대기하고 구독하면 그 때 모든 이벤트를 방출하는 Observable

ex. 스트리밍 서비스(VOD), Single, just, of

 

- 스트리밍 서비스 처럼 처음부터 끝까지 모든 이벤트 스트림을 받을 수 있다

- 언제 구독 하던지 항상 처음부터 모든 데이터를 방출하고, observable 생성 시점이 아닌 구독 시점부터 방출한다

 

 

이건 참조 글에서 본 내용인데 재미있어서 기재해둔다

Hot을 Cold 처럼 그리고 Cold를 Hot 처럼 사용하고 싶으면 아래와 같은 방법이 있다

 

Hot Observable -> Cold Observable

Replay Subject를 사용하면 버퍼에 최신 이벤트들을 담아 놓을 수 있어

Replay를 구독하면 버퍼에 담긴 이벤트 들이 방출되기에 Cold의 효과를 볼 수 있다

 

Cold Observable -> Hot Observable

publish() 연산자를 통해 Hot 처럼 동작시킬 수 있다 

(???) 나중에 알아봐야지,,

 

 

 

Combine

Combine은 2019년 WWDC에서 Apple이 공개한 first-party 반응형 프레임워크이다

Publisher와 Substriber 프로토콜을 통해 상호작용한다

 

Publisher

하나 혹은 여러 개의 Subscriber 객체에 시간의 흐름에 따라 값을 내보낼 수 있는 타입을 선언하기 위한 프로토콜

Output, Failure 타입이 제네릭으로 구현되어 있다

 

AnyPublisher

Publisher 프로토콜을 채택하고 있는 struct

RxSwift의 Observable 역할 수행

 

Publishers

Publisher의 네임스페이스(enum)

Publisher의 다양한 연산자는 Publishers의 extension을 통해 기능을 구현한다

 

 

RxSwift vs Combine

 

스펙 비교

https://github.com/freak4pc/rxswift-to-combine-cheatsheet

 

 

연산 시간 및 메모리 할당 성능 비교

https://medium.com/flawless-app-stories/will-combine-kill-rxswift-64780a150d89

 

 

Combine은 Apple이 자체적으로 제공하는 프레임워크인 만큼,

iOS와 macOS 시스템과의 최적화가 잘 되어 있어 메모리 효율이 뛰어나고 속도가 빠르며 

메모리 누수를 방지하는 데 유리한 구조를 가지고 있다

 

처음 Combine이 나왔을 때는 SwiftUI + Combine, UIKit + RxSwift 로 사용되어 졌는데

이제는 UiKit에서도 Combine 기능을 도입할 수 있는 길이 많이 넓어진 걸로 안다

 

 

.

.

.

 

 

이 두가지 큰 개념을 한 포스팅에 정리하는게 아니었던거 같다,,

가볍게 정리하려고 했는데 애초에 모르는게 너무 많은 상태였어서

중구난방이 될까봐 Observable과 Publisher만 정리했고 각각의 개념은 따로 정리해봐야겠다,,

 

 

 

References

1. https://medium.com/@radiantchoi/rxswift와-combine에서-꼭-알아야-할-오퍼레이터-비교-6a52755a1437

2. https://blog.wakmusic.xyz/rxswift-vs-combine-개념편-1-a2ecaed5a3e0

3. [Rx: Hot&Cold Observable] https://medium.com/@hyosing92/rxswift-hot-vs-cold-6deb989cde04

 

'IOS 개발지식 > iOS' 카테고리의 다른 글

[iOS] XCTest를 활용한 UnitTest  (1) 2024.11.13
[iOS] 클린 아키텍처  (0) 2024.11.10
[iOS] AppDelegate와 SceneDelegate  (2) 2024.11.08
[iOS] 앱 생명주기(App Life Cycle)  (5) 2024.11.07