λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/RxSwift

[iOS] RxSwift - Subject vs Observable

by Danna 2021. 7. 14.
728x90
728x90

κ³°νŠ€κΉ€λ‹˜ κ°•μ˜ [3κ΅μ‹œ] RxSwift ν™œμš©λ²”μœ„ λ„“νžˆκΈ°μ— ν•΄λ‹Ήν•˜λŠ” λ‚΄μš©μž…λ‹ˆλ‹€!

 

πŸ’‘ RxSwift - Observable vs Subject 

Observable 은 μ–΄λ–€ 데이터λ₯Ό 내보내야할지 미리 정해진 ν˜•νƒœμ˜ μŠ€νŠΈλ¦Όμ΄λ‹€. create ν•˜λŠ” μ‹œμ λΆ€ν„° 값이 μ •ν•΄μ Έμžˆκ³ , μ€‘간에 데이터 값을 λ³€κ²½ν•  수 μ—†λ‹€. 

 

λ²„νŠΌ μ‘°μž‘μœΌλ‘œ 데이터 값을 λ³€κ²½ν•΄μ•Όν•˜λŠ” λ“±μ˜ μƒν™©μ—μ„œλŠ” Observable λŒ€μ‹  Subject λ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. Subject λŠ” Observable μ™ΈλΆ€μ—μ„œ 데이터λ₯Ό 넣어쀄 μˆ˜λ„ 있고, ꡬ독할 μˆ˜λ„ μžˆλŠ” μ–‘λ°©ν–₯성을 가진 νƒ€μž…μ΄λ‹€!

 

Subject λŠ” 일반 Observable 처럼 subscribe ν•˜μ—¬ event λ₯Ό 전달받을 수 있음과 λ”λΆˆμ–΄, Subject μ™ΈλΆ€μ—μ„œ onNext, onCompleted, onError, onDisposed 등을 톡해 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ stream 을 λŠμ„ 수 μžˆλ‹€!

 

πŸŒ±μ •λ¦¬ν•˜μžλ©΄,
Rx μ—μ„œ Subject λŠ” Observable μ΄λ©΄μ„œ Observer 인 νƒ€μž…μ΄λ‹€.
Observable 이기 λ•Œλ¬Έμ—, 이λ₯Ό κ΅¬λ…ν•˜λŠ” Observer μ—κ²Œ event λ₯Ό 전달할 수 있으며
Observer 이기 λ•Œλ¬Έμ—, ν•˜λ‚˜ μ΄μƒμ˜ Observable을 ꡬ독할 수 있으며 event 에 λŒ€ν•œ 처리λ₯Ό ν•  수 μžˆλ‹€.

πŸ‘€ Subject μ’…λ₯˜λ“€ - Publish, Behavior, Async, Replay

Subject λŠ” μ—¬λŸ¬κ³³μ—μ„œ subscribe ν•  수 있으며, κ³°νŠ€κΉ€λ‹˜ κ°•μ˜μ— μ˜ν•˜λ©΄ Publish, Behavior λ₯Ό κ°€μž₯ 많이 μ‚¬μš©ν•œλ‹€κ³  ν•©λ‹ˆλ‹€. 

 

1. Publish Subject (is known simply as a subject)

  • PublishSubject λŠ” subscribe 이후에 observable 듀이 λ°©μΆœν•œ λ°μ΄ν„°λ§Œ observer μ—κ²Œ λ°©μΆœν•œλ‹€.
  • observer κ°€ subscribe ν•œ μ‹œμ  이후에 μƒμ„±λœ λ°μ΄ν„°λ§Œ 전달받을 수 μžˆλ‹€.
  • λ§ˆλΈ” λ‹€μ΄μ–΄κ·Έλž¨μ„ 보면, 첫번째 observer λŠ” κ΅¬λ…ν•œ μ‹œμ  이후 λΉ¨κ°•, 초둝, νŒŒλž‘ 데이터λ₯Ό μ „λΆ€ μ „λ‹¬λ°›μ§€λ§Œ, λ‘λ²ˆμ§Έ observer λŠ” κ΅¬λ…ν•œ μ‹œμ  이후에 방좜된 νŒŒλž‘ λ°μ΄ν„°λ§Œ μ „λ‹¬λ°›λŠ”λ‹€.

Publish Subject 단점!?

  • subject κ°€ μƒμ„±λ˜λŠ” μ‹œμ κ³Ό observer κ°€ subject λ₯Ό κ΅¬λ…ν•˜λŠ” μ‹œμ  사이에 λ°°μΆœλ˜λŠ” ν•­λͺ©λ“€μ€ μžƒμ–΄λ²„λ¦΄ 수 μžˆλ‹€λŠ” 단점이 μžˆλ‹€.
  • μœ„μ˜ 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ΅¬λ…ν•˜λŠ” μ‹œμ μ— κΈ°λ³Έκ°’ or λ§ˆμ§€λ§‰κ°’μ„ μ „λ‹¬λ°›λŠ” Behavior Subject ν˜Ήμ€ λͺ¨λ“  데이터λ₯Ό 전달받을 수 μžˆλŠ” ReplaySubject λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

 

2. Behavior Subject

  • observer κ°€ BehaviorSubject λ₯Ό κ΅¬λ…ν•˜λ©΄, κ°€μž₯ 졜근의 데이터 ν˜Ήμ€ (졜근 데이터가 μ—†λ‹€λ©΄) κΈ°λ³Έ 값을 λ°©μΆœν•œλ‹€. κ·Έ μ΄ν›„μ˜ λ™μž‘μ€ Publish Subject 와 λ™μΌν•˜λ‹€.
  • Observer 에 κ΅¬λ…ν•˜λŠ” μ‹œμ μ€ λ‹€λ₯΄μ§€λ§Œ 이전에 방좜된 데이터λ₯Ό κ°€μ Έμ˜¬ ν•„μš”κ°€ μžˆμ„ λ•Œ, μ΄μš©ν•˜λ©΄ 될 것 κ°™λ‹€.
  • BehaviorSubject λ₯Ό μ΄μš©ν•˜λ©΄, PublishSubject μ—μ„œ 데이터가 방좜되기 μ „κΉŒμ§€ 아무 값도 κ°€μ§ˆμˆ˜ μ—†λŠ” 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€!
  • λ§ˆλΈ”λ‹€μ΄μ–΄κ·Έλž¨μ„ μ‚΄νŽ΄λ³΄λ©΄, 첫번째 observer μ—κ²ŒλŠ” λΆ„ν™μƒ‰μ˜ 기본값이 μ „λ‹¬λ˜κ³  λ‘λ²ˆμ§Έ observer μ—κ²ŒλŠ” κ°€μž₯ μ΅œκ·Όκ°’μΈ μ΄ˆλ‘μƒ‰μ΄ μ „λ‹¬λ˜λŠ” 것을 확인할 수 μžˆλ‹€. 

3. AsyncSubject

  • AsyncSubject λŠ” completed λ˜λŠ” μ‹œμ μ— λ§ˆμ§€λ§‰ 데이터 ν•˜λ‚˜λ§Œ λ°©μΆœν•œλ‹€. λ°μ΄ν„°κ°€ μƒμ„±λ˜λ”λΌλ„ λ°”λ‘œ 내렀주지 μ•ŠλŠ”λ‹€.
  • λ§Œμ•½ subject κ°€ κ΅¬λ…ν•˜λŠ” observable 이 였λ₯˜λ‘œ 인해 μ’…λ£Œλœ 경우, AsyncSubject λŠ” 아무것도 λ°°μΆœν•˜μ§€ μ•Šκ³  λ°œμƒν•œ 였λ₯˜λ₯Ό κ·ΈλŒ€λ‘œ μ „λ‹¬ν•œλ‹€.
  • λ§ˆλΈ” λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ | 으둜 ν‘œμ‹œλœ 것은 observable 의 completed μ‹œμ μ„ μ˜λ―Έν•œλ‹€. 

4. ReplaySubject 

  • ReplaySubject λŠ” μƒˆλ‘­κ²Œ κ΅¬λ…ν•˜λŠ” observer μ—κ²Œ 기쑴에 λ°©μΆœλ˜μ—ˆλ˜ 데이터듀을 λ‹€μ‹œ μ „λ‹¬ν•œλ‹€. λ°μ΄ν„° emit 을 replay ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ 이해가 μ‰¬μšΈλ“― ν•˜λ‹€!
  • μƒμ„±μ‹œ bufferSize λ₯Ό 지정해, κ΅¬λ…μ‹œ 전달할 λ°μ΄ν„°μ˜ 개수λ₯Ό 지정할 수 μžˆλ‹€.
  • λ§ˆλΈ” λ‹€μ΄μ–΄κ·Έλž¨μ„ 보면 첫번째 observer λŠ” ꡬ독 이후에 데이터가 μƒμ„±λ˜μ—ˆμœΌλ―€λ‘œ, 방좜 μ‹œμ μ— μ „λ‹¬λ°›λŠ”λ‹€. λ‘λ²ˆμ§Έ observer λŠ” κ΅¬λ…ν•˜λŠ” μ‹œμ μ— 이전 방좜된 데이터λ₯Ό ν•œλ²ˆμ— 전달받고, κ·Έ 이후 μƒˆλ‘œμš΄ 데이터도 μ „λ‹¬λ°›λŠ”λ‹€. 

 

5. Variable ?

  • λͺ‡λͺ‡ μ°Έκ³ κΈ€μ—μ„œλŠ” Variable 도 Subject 의 μ’…λ₯˜λ‘œ ν•¨κ»˜ μ •λ¦¬λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ, Reative λ¬Έμ„œμ— μ—†μ–΄ μ°Ύμ•„λ³Έ κ²°κ³Ό 
  • RxSwift4.0 λΆ€ν„° variable 은 deprecated λ˜μ—ˆκ³ , 이와 λ™μΌν•œ κΈ°λŠ₯의 BehaviorRelay κ°€ μƒˆλ‘œ λ‚˜μ™”λ‹€κ³  ν•œλ‹€.
  • 좔후에 Relay κ΄€λ ¨ν•˜μ—¬ 정리할 λ•Œ μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€!

 

 

 

ReactiveX - Subject

If you have a Subject and you want to pass it along to some other agent without exposing its Subscriber interface, you can mask it by calling its asObservable method, which will return the Subject as a pure Observable. See Also

reactivex.io

 

songda515/MVVM_RxSwift

MVVM νŒ¨ν„΄κ³Ό RxSwift λ₯Ό ν•™μŠ΅ν•˜κ³ , 이λ₯Ό μ μš©ν•œ ν”„λ‘œμ νŠΈλ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•œ μŠ€ν„°λ””λͺ¨μž„μž…λ‹ˆλ‹€. - songda515/MVVM_RxSwift

github.com

728x90
728x90