티스토리 뷰

TIL

[TIL] 2022 / 10 / 27 - Rx

희철 2022. 10. 27. 17:32

Observable과 Subject

 

 

Subject는 Observable이자 Observer

 

Subject는 스트림 공유

-> 즉, Subscribe할때마다 새로운 시퀀스가 생성되는게 아니라서 리소스 낭비를 줄일 수 있음.

 

Subject에는 Publish, Behavior, Replay, Async가 있는데 다 share()를 내부적으로 갖고있기때문에 따로 추가해주지 않아도됨

 

 

subscribe와 bind

 

 

subscribe는 next, error, complete가 있는데, 무한한 시퀀스에서는 error나 complete를 안씀.

-> UI를 핸들링하는 부분은 실패할 일이 거의 없기때문에 error나 complete가 필요없기때문에 bind사용

 

bind는 UI핸들링에 특화되어있고, 메인스레드에서 동작

 

 

 

bind와 drive

 

 

drive도 마찬가지로 이벤트를 전달할 때 사용.

 

하지만 drive는 스트림 공유

 

그래서 drive를 사용한다면 share를 사용할 필요가 없음.

 

bind를 꼭 사용해야하는 상황이 아니면 drive를 사용

 

 

 

Subject와 Relay

 

 

Relay는 next만 방출함

-> Relay는 UI핸들링에 최적화되어있는 요소이기때문에 complete랑 error를 다룰 필요가 없음

 

Relay에는 Publish와 Behavior만 있음

 

Relay에서는 next대신 accept사용

 

Relay는 drive와 짝꿍

 

 

 

Share

 

 

일반적으로 subscribe(bind)를 할 때마다 새로운 시퀀스가 생성됨.

 

그래서 subscribe를 여러 번 하는 경우엔 불필요한 리소스가 발생

-> 네트워크의 경우 share()가 없으면 콜 수가 너무 많아질 수도 있음

subject는 내부에 share()가 있다고했음.

 

그래서 위와 같이 스트림을 공유하는 경우에는 같은 수가 나오고, 아닌 경우에는 매번 다른 수가 나옴

-> 매번 새로운 시퀀스를 생성한다는 말임.

 

아래와 같이 share를 사용해서 해결하거나 Relay객체로 선언하여 drive를 이용해 해결할 수 있음.

 

bind와 drive는 위에서 말했듯이 옵저버블이 UI로 특화된 형태이기때문에 subscribe만 할 수 있고 값을 변경할 수 없음

 

또한 메인 스레드에서의 실행을 보장함

 

근데 drive는 스트림을 공유함

-> 내부적으로 share메서드가 구현되어 있음

'TIL' 카테고리의 다른 글

[TIL] 2022 / 12 / 19 - SwiftUI  (0) 2022.12.19
[TIL] 2022 / 11 / 1  (0) 2022.11.01
[TIL] 2022 / 10 / 26 - Rx  (0) 2022.10.26
[TIL] 2022 / 10 / 25 - Rx  (0) 2022.10.25
[TIL] 2022 / 10 / 24 - Rx  (0) 2022.10.24
댓글
최근에 올라온 글
Total
Today
Yesterday