
안드로이드를 공부하던 때에도 iOS 파트분들이 따로 RXswift에 대해 공부하던 것을 봤고
그동안 RXSwift에 대해서 많이 들어왔지만 전혀 몰랐었는데 드디어 공부하고 정리해보려합니다.
RX(Reactive X)는 위 내용을 그대로 해석해보면 Observable Stream을 사용한 비동기 프로그래밍을 위한 API라고 합니다.
RXswift는 그 중 하나라고 해요.
참고 : https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md
RXSwift는 왜 쓸까요?
RX는 기본적으로 비동기적으로 움직이는 애플의 api들과 수시로 상태가 변하는 환경에서 보다 직관적이고 효율적인 코드를 작성할 수 있게 도와줍니다.
그렇다면 어떤식으로 도와주는 걸까요?

코드 형태를 먼저 볼게요
위 예시를 보시면 맨 처음에 Obervable이라는 것이 보이는데
이 객체를 통해 이벤트 흐름을 표현하고 combineLatest, map등의 오퍼레이터들을 통해서 이벤트 속에 값들을 다양한 형태로 조합을 하고 변경합니다.
또한 위의 bind를 이용하면 DispatchQueue를 통해 백그라운드의 작업 후 메인스레드로 돌려주어야하는 등의 작업을 자동적으로 처리해준다고합니다.
또 다른 예시를 보겠습니다.

그동안 여러개의 api요청들을 클라이언트에 반영해보았습니다.
만약 실행도중 api가 실패한다면 다시 요청하도록 해보는 것을 생각해보았는데 쉽지는 않아보입니다.
바로 이때 RX에는 이러한 retry라는 재시도 관련된 메소드가 있어서 쉽게 적용할 수 있다고 합니다.
아래 코드는 실패했을때 3번 재시도하는 기능입니다.

다음은 delegate예시 입니다.

스크롤뷰의 움직임 상태를 알기위해 위와 같은 딜리게이트 함수를 구현해야합니다.
위 코드만으로는 어떤 스크롤뷰인지 알 수 없고 따로 딜리게이트를 선언해주어야합니다. 불편하죠
이러한 상황 또한 아래와 같은 RX 코드를 통해 해결 가능합니다.

resultTableView의 contentOffset을 원하는 곳에 binding해주고 있습니다.
훨씬 직관적이라는 것을 알 수 있습니다.
RX는 조합이 가능하고 재사용가능한 문법들을 제공합니다.
선언형이기 때문에 정의를 변경하는 것이 아닌 Operator를 통해 데이터만 변경합니다.
상태를 저장하는 것 보다 단방향 데이터 흐름으로 모델링하기에 안정적이라고 합니다.
DOCS를 열면 다섯가지 주요 기능이 나오는데 Observable부터 보겠습니다.

Observable
Observable은 기본적으로 스위프트에서 제공하는 시퀀스와 동일합니다.
시퀀스는 Array의 형태로 마주한것이 대표적인 시퀀스의 형태입니다.
시퀀스란 각 요소를 하나씩 순회할 수 있는 타입입니다.
- Element형태의 데이터 스냅샷을 전달할 수 있는 일련의 이벤트를 비동기적으로 생성(emit).
- 하나의 이상의 observer가 실시간으로 이벤트에 반응
- 세가지 유형의 이벤트만 방출.
다른 클래스에서 만든 값을 시간에 따라 읽을 수 있습니다.
하나 이상의 옵저버가 실시간으로 어떤 이벤트에 반응하게 됩니다. 이런 것들은 앱 ui를 업데이트하거나 생성하는지를 처리하고 활용할 수 있게 합니다.


next는 최신 또는 다음 데이터를 전달하는 이벤트입니다.
complete은 성공적으로 일련의 이벤트들을 종료시키는 이벤트입니다.
observable이 성공적으로 자신의 생명 주기를 완료해서 추가적으로 이벤트를 더 이상 생성하지 않을 거라는 것을 의미해요. 그냥 끝이라는 의미예요.
error는 이제 시프트의 에러를 감싸서 방출합니다. 이것은 observable이 에러를 발생시켜서 추가적으로 이벤트를 생성하지 않음을 의미합니다.
아래 마블 다이어그램을 보시면
시간에 걸쳐 발생하는 비동기 이벤트를 시각적으로 나타낸 것으로 여러 케이스중 하나를 예시로 든 것인데요.
시퀀스 Observable<Int>가 Int(Element)를 next에 담아서 하나씩 방출할 때 이 Observable을 Observer들이 관찰하고 수신할 수 있게됩니다.
따로 delegate프로토콜을 사용하거나 클래스간의 통신을 위한 클로져 등이 필요 없습니다.

이제 예제를 보면서 Observable의 연산자들을 알아보겠습니다.
Operator
just, of, from

위 Obervable의 이벤트 방출여부를 알아내는 과정은 어떻게 되는 걸까요?
지금 Obervable은 시퀀스의 정의일 뿐 Observer에게 Subscribe되기 전에는 아무런 이벤트도 emit하지 않는다고 합니다.
subscribe를 하고 onNext이벤트를 통해 발생되는 이벤트를 받아 출력되는 결과를 보겠습니다.

출력결과

이번엔 Subscribe안에 onNext이벤트 없이 출력해보겠습니다.
출력결과를 보시면 onNext없이 출력된 경우 이벤트들이 그대로 래핑되어 출력되는 것을 보실 수 있습니다.

출력결과

empty
위의 예시들은 하나 또는 여러개의 요소를 가진 Observable을 만들었지만 0개인경우 empty 오퍼레이터를 사용해 생성합니다.
empty같은 경우 아무런 이벤트도 프린트 되지않습니다.

never
다음은 never 연산자입니다.
never의 출력결과를 보시면 empty연산자와 다르게 onCompleted이벤트 조차 출력이 안 되는 것을 알 수 있습니다.

출력 결과

never연산자의 작동을 확인하기 위해서 debug()를 사용합니다.


never가 subscribe되었다고 출력됩니다.
range
범위안의 Array를 start부터 count만큼의 값을 갖도록 만들어줍니다.
구구단을 출력해보겠습니다.

출력결과

dispose
방금전까지 Observable을 subscribe(구독)을 하여 이벤트를 받을 수 있었습니다.
이번엔 그 구독을 취소하는 것에 대해 알아보겠습니다.
dispose한 뒤에는 더이상 이벤트 방출이 안 됩니다.


비슷한 방법으로 disposeBag을 이용한 dispose하는 방법이 있습니다.

dispose는 메모리 누수를 방지하기위해 꼭 필요합니다.
create
observable을 만드는 또다른 연산자 create입니다.
observer를 받아서 Disposable로 리턴시킵니다.


Observable.create의 create는 escaping Closure이기에 Subscribe했을 때
Observable시퀀스에 값을 쉽게 추가할 수 있습니다.
위 출력결과를 보면 onNext(2)의 이벤트는 그전에 onCompleted가 호출되어 Observable이 종료되었기에
방출되지 않는 것을 알 수 있습니다.
이번엔 에러를 추가한 모습입니다.
에러를 방출하고 곧바로 disposed된 것을 알 수 있습니다.

출력결과

defered
subscriber들에게 새롭게 observable항목을 제공하는 observable factory를 만드는 방식
observable factory : obsavable을 감싸는 observable


onOff 값에 따라 서로 다른 Observable을 반환합니다.
Observable.deferred로는 Observable factory를 통해서 Observable 시퀀스를 생성할 수 있는 연산자입니다.
'IOS' 카테고리의 다른 글
[iOS] RXswift (3) - Subject (0) | 2022.05.13 |
---|---|
[iOS] RXswift (2) - Traits (0) | 2022.05.13 |
iOS) UIImagePickerController (0) | 2022.05.11 |
iOS) 스토리보드 없이 인스타그램 레이아웃 그리기 & ActionSheet (0) | 2022.05.10 |
iOS) 스토리보드 없이 레이아웃 그리기 연습 & 공유기능(Share Sheet) 구현 예제 (3) (0) | 2022.05.08 |
댓글