SeSAC iOS 데뷔과정 2기

1026 새싹 78회차 정리 - RxSwift Relay

Lia's iOS 2022. 10. 26. 21:52
iOS 앱 개발자 데뷔 과정 78회차

 

 

 

 

#1. Checklist

- Relay

- Subject & Relay

Subject는 이벤트에 대한 emit과 subscribe를 모두 할 수 있는, Observable과 Observer가 합쳐진 객체이다. (77회차 참고)

하지만 보다 더 UI에 적합한 형태가 필요했고, Subject를 내부에서 Wrapping해 Relay를 제공하게 된다.

 

Relay는 PublishRelay, BehaviorRelay 두가지가 있고, Subject와 거의 유사한 특성을 가지고 있다.

Subject와 Relay의 가장 큰 차이는 Relay의 경우 Completed와 Error 이벤트를 받지 못한다는 것이다.

UI가 Error와 Completed 이벤트를 받으면 더이상 next 이벤트를 전달받을 수 없게 되고, 반응형의 장점이 사라지게 되기 때문이다.

 

Relay는 Completed와 Error 이벤트를 받지 못하기에 disposed 되기 전까지 subscribe가 해제되지 않는다.

따라서 desposed가 호출되는 deinit 시점에 해제되거나, 직접 처리를 해주어야 한다.

그래서 Relay는 next 이벤트만 처리하며, next 이벤트를 accept 라는 키워드로 사용한다.

Subject는 Observable과, Relay는 Driver와 자주 사용된다.

 

 


 

- PublishRelay

PublishSubjet와 거의 동일하며, 초기값이 존재하지 않을 때 사용한다.

 

ViewModel

 

ViewController

 


 

- BehaviorRelay

BehaviorSubjet 와 거의 동일하며, 초기값이 존재할 때 사용한다.

 

 


 

- Observable

1~6 의 코드는 모두 같은 동작을 하는 코드이다.

 

- subscribe

1, 2 의 코드는 가장 간단하고 기본적인 subscribe 의 형태이다.

Background Schedular 에서 동작할 수 있는 가능성 (네트워크 통신, 파일 다운로드 등) 이 있기 때문에 Observable의 데이터 흐름을 MainSchedular (메인 쓰레드) 에서 동작할 수 있도록 한 것이 3번의 코드이다.

 

 


 

- bind

bind는 subscribe와 유사하지만, Main Schedular에서 동작하며 error 이벤트를 방출하지 않는 특성을 지녔다.

5번의 코드에서는 tap의 ControlEvent<Void> 에 map Operator를 적용해, 데이터의 흐름을 조작했다.

이렇게 하면 String 타입으로 변경이 가능하고, label.rx.text로 간단하게 bind 해줄 수 있다.

 

 


 

- drive (Driver & Traits)

UI 처리에 특화된 Observable을 Trait 이라고 부른다.

Traits에 해당하는 Observable의 공통적인 특성은 Main Thread에서 실행되며, error 이벤트를 방출하지 않는다는 점이다.

그리고 Traits 중 Signal을 제외하고는 share 연산자가 내부적으로 사용되고 있기 때문에, subscribe를 할 경우 동일한 시퀀스를 공유하게 된다.

 

RxSwfit : Single, Completable, Maybe

RxCocoa  : Driver, Signal, ControlProperty/ControlEvent

 

 

여기서 Control Property는 Traits 중 가장 기본형으로, rx 네임 스페이스와 함께 사용된다.

Control Property

 

Control Event는 event를 Observable로 래핑한 속성으로, Control Property와 다르게 Observer의 역할은 수행하지 못한다.

Control이 해제될 경우 Complete 이벤트를 방출한다.

Control Event

 


 

- Operator

- orEmpty

String? 타입을 String 타입으로 바꿔주며, 만약 nil일 경우 빈 문자열을 반환한다.

 


 

- debounce vs throttle

debounce : 타이머를 설정한 후, 타이머가 끝난 시점에 가장 마지막 값을 방출한다.

이벤트가 방출될 때마다 타이머가 초기화된다.

 

throttle : lastest 라는 프로퍼티의 Bool 값에 따라 동작이 조금 달라진다.

lastest의 기본값은 true이며, 이 경우 타이머로 설정한 시간 내의 최초 값과 마지막 값을 방출한다.

false일 경우 타이머로 설정한 시간 내의 최초 값만 방출한다.

이벤트 시작과 함께 타이머가 작동하며, debounce와 다르게 시간 종료까지 타이머가 초기화되지 않는다.

API 요청 등에서 짧은 시간 내 중복 클릭을 방지하고 싶을 때 사용할 수 있다.