iOS/RxSwift

RxSwift 간단 핵심 정리

Developer-Michelle 2023. 2. 18. 11:36

Reactive Programming

entity 방출 요소에 의존, 변경 사항을 구독, 해당 변경 사항에 반응.

 

왜 RxSwift 이용하는가?

상태를 다시 확인하고 수동으로 코드에 조건을 입력하지 않아도 됨

if -else 나 switch 구문 등을 많이 줄일 수 있다.

비동기 실행 코드를 observable-subscriber method에 의해 깔끔하게 짤 수 있음

 

핵심 요소

1. Observable : 모든 데이터 유형이 될 수 있는 Entity

모든 다른 유형의 이벤트가 발생 시 Observer에게 요소를 방출

 

2. Observer: 관찰 가능 항목 구독, 변경사항 수신, 모든 변경사항에 대해 프로그래밍된 조치를 취한다.

 

3. Dispose Bag: 특정 파일의 메모리 할당이 해제될 때마다 이걸 통해서 dispose. -> 메모리 누수 발생을 막음

 

4. Subject:  Observable이자 Observer. 4가지 기능이 있다 (Publish, Behavior, Replay, Async)

-Publish: 초기값 X. subscriber에게 새 요소를 방출.

-Behavior: 초기값 O

-Replay: 버퍼크기로 초기화.

-Async: Sequence의 마지막 다음 이벤트만 방출.

 

5. Relay: 종료되지 않는 시퀀스 (UI 에 많이 이용)

(2가지 타입: PublishRelay, BehaviorRelay. subject와 거의 유사한 특성을 가짐.)

-next 이벤트만 처리. next 이벤트를 accept 라는 키워드로 사용.

(onNext만 O. onCompleted,onError 방출하지 않음.

따라서, disposed가 되기 전까지 subscribe이 해제되지 않음. diposed가 호출되는 deinit 시점이나 직접 처리를 해주어야 함.)

 


*subject vs. relay 가장 큰 차이점? Relay의 경우, completed와 error 이벤트를 받지 못함.

*subject는 observable과, relay는 driver와 자주 사용이 됨.


 

6. Operators

-Filtering Operators ex) .elementAt(index), .skip(n) 필터링

-Transforming Operators ex) .toArray(), .map() 변형

-Combining Operators ex) .concat(), .zip 콤바이닝

-Time-based Operators ex) replay(), interval(schedulers) 시간 관련 연산자

 

7. Schedulers: 프로세스가 발생하는 컨텍스트.

-subscribeOn() : 쓰레드 전환

-observeOn() : 관찰이 발생하는 스케줄러를 변경


 

8. Traits & Driver

Trait: UI 처리에 특화된 Observable.

RxSwift 에서 제공해주는 observable, RxCocoa에서 제공해주는 observable이 있다.

-Traits에 해당하는 observable의 공통적인 특성은 main thread에서 실행된다는 점. 그리고 error이벤트 없음.

*RxSwift - Single, Completable, Maybe

*RxCocoa - Driver, Signal, ControlProperty/ControlEvent

 

8-1. Driver

-Main Thread에서의 실행을 보장해준다.

-Observable이 UI로 특화된 형태이기 때문에, subscribe만 할 수 있고 값을 변경할 수는 없다.

-bind와 달리 stream 공유가 된다. (bind는 subscribe의 별칭)

-driver는 내부적으로 share(replay:1, scope:.whileConnected)가 구현되어 있음

 

8-2. Share

-일반적으로는 subscribe 할 때마다 새로운 시퀀스가 생성이 된다.

-따라서, 여러 subscribe을 하게 될 경우, 불필요한 리소스가 발생할 수 있기 때문에, 내부적으로 모든 subscribe가 하나의 subscribe를 공유할 수 있도록 해야함.

-replay와 scope를 통해 버퍼사이즈와 유지 상태를 결정할 수 있음.

ex) share()가 구현되어 있지 않다면, 네트워크 요청이 여러 번 일어나게 됨. 따라서 불필요한 콜이나 리소스 낭비가 생기지 않도록 subscribe를 공유할 수 있게 처리함.

 

 

 

참고) 새싹 앱개발자 데뷔과정 78회차 pdf 자료

참고) https://medium.com/technology-nineleaps/basics-of-reactive-programming-in-swift-rxswift-8202883a02a7