본문 바로가기
iOS/개념

Rx

by 나리._. 2021. 11. 2.

Rx ??? 뭐가 좋은데 그게?

Rx는 기본적으로 비동기적으로 움직이는 애플의 api들과 수시로 상태가 변하는 환경에서 보다 직관적이고 효율적인 코드를 작성할 수 있게 도와준다.

 

RxSwift 문서에서 제공하는 예시를 통해 확인해 보자!

 

첫번째 예시.

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md#bindings

위의 예시를 해석해보면

Observable 이라는 객체를 통해 이벤트의 흐름을 표현하게 되고,

combineLatest, map과 같은 오퍼레이터를 통해 Observable이 내뱉는 이벤트 속의 값들을 여러 형태로 조합하고 변경한다.

또 bind(RxCocoa에서 제공하는 개념)를 통해 원래 디스패치 큐를 이용해 조정해주어야했던 설정들을 자동으로 처리하는 UI 코드를 작성하게 된다.

 

 

두번째 예시.

우리는 수많은 API를 통신을 기반으로한 앱을 만드는데

API콜이 실패하는 상황에서 몇번 재시도를 해볼수있도록 처리해놓으면 좋을 것이다.

하지만 이 재시도를 구현 하는 것은 매우 복잡하고 코드 자체에는 표현되지않지만, 다양한 상태변화(특히 재사용 할수 없는 상태)가 있을 것이다. 

 

Rx에는 기본적으로 제공하는 retry라는 연산자가 존재한다.

따라서 아주 간단하게 재시도를 할수 있다..!

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md#retries
https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md#retries

 

세번째 예시.

이번 예시는 Delegates이다.

우리가 스크롤 뷰가 움직였는지 확인을 하려면 아래와 같은 형태의 ScrollView Delegate를 구현을 해야한다.

아래 코드만 봤을때, 어떤 스크롤 뷰에 이러한 명령을 하는 지 알 수 없고 전체 코드를  봐야한다.

Delegate를 별도로 또 선언을 해주어야한다.

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md#delegates

 

하지만 Rx를 사용하면 훨씬 직관적으로 표현이 가능하다.

resultsTableView가 가지고 있는 스크롤 뷰에 OffSet을 원하는 곳에 바인딩 해주고 있음을 알 수 있다.

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md#delegates

 

 

애플이 제공하는 ios sdk내에서 비동기식 코드를 작성할 수 있도록 제공하고 있는 다양한 API가 있는데,

일반적으로 대부분의 클래스들은 비동기적으로 작업을 수행하고 UI 구성요소들은 본질적으로 비동기이다.

 

따라서 내가 코드를 작성했을때, 어떤 순서로 작동하는지 가정하는 것 자체가 불가능하다!

앱의 코드는 사용자 입력, 네트워크 활동, 기타 OS 이벤트와 같은 다양한 외부 요인에 따라 완전히 다른 순서로 실행될 수 있다.

 

결국 문제는 애플의 sdk내에 다양한 API를 통한 복합적인 비동기 코드는 부분별로 나눠쓰기 매우 어렵고 개발자가 추적하기는 불가능하다는 것이다!

 

이들 대신에 보다 직관적이고 효율적으로 표현할 수 있게 Rx가 제공해주고 있다.

 

Rx ??? 뭐가 좋은데 그게? 에 대해 정리를 해보자면,

• Composable 조합가능하고
• Reusable 재사용가능한 문법을 제공
• Declarative 선언형 이기 때문에 정의를 변경하는 것이 아닌, 오퍼레이터를 통해서 데이터만 변경한다.
• Understandable and concise 이러한 특성 덕분에 이해하기 쉽고 간결하며
• Stable 상태를 저장하기 보단, 앱을 단방향 데이터 흐름으로 모델링하기 때문에 안정적이다.

 

 

참조 문서

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md

 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com