iOS/RxSwift

RxSwift] Observable, Observer, Subjects

iOS_Dev_Ruel 2024. 8. 25. 21:28

안녕하세요 Ruel입니다.

RxSwift 두 번째!

Observable, Observer, Subject에 대해서 알아봅시다.


Observable, Observer, Subjects

RxSwift에는 핵심을 이루는 세 가지 Observable, Observer, Subjects 가 있어요.

 

1. Observable

Observable은 데이터 스트림을 제공하는 객체입니다.

이벤트나 데이터를 지속적으로 발행하는 역할을 해요.

데이터는 시간의 흐름에 따라 변경될 수 있으며, Observable은 이러한 변화를 구독자(Observable)에게 전달해요.

 

Observable은 단일 값이 아닌, 시간의 흐름에 따라 여러 값을 보낼 수 있어요.

예를 들어, 네트워크 요청 결과, 사용자 입력, 타이머 이벤트 등이 Observable의 값이 될 수 있죠

 

Observable은 이벤트 발생을 하는 데 있어서 세 가지로 나누어져요.

  1. onNext: 새로운 데이터를 발행
  2. onError: 오류가 발생하였을 때 오류를 발행하고 스트림 종료
  3. onCompleted: 더 이상 데이터가 없음을 알리고 스트림 종료
let observable = Observable.just("Hello, RxSwift")

- 위 코드는 just라는 메서드를 통해 "Hello, RxSwift"라는 단일 이벤트를 발행하는 Observable을 생성하고 있어요

 

2. Observer

Observer는 Observable을 구독하여 데이터를 수신하는 역할을 해요.

즉, Observable이 발행하는 이벤트를 처리하는 객체예요.

 

Observer는 Observable의 이벤트를 수신하기 위해서 구독이 필요한데요.

구독을 통해 Observer는 onNext, onError, onCompleted 이벤트를 처리해요.

Observable의 이벤트 스트림이 onCompleted나 onError로 종료되면 구독도 종료돼요.

observable.subscribe(onNext: { value in
	print(value)
})

- 위 코드는 subscribe라는 메서드로 observable을 구독하고, 새로운 데이터(onNext)가 있을 때 데이터를 출력해요.

 

3. Subjects

Subject는 Observable과 Observer의 역할을 모두 수행할 수 있는 특별한 객체예요.

Subject는 데이터를 발행하는 동시에 다른 Observer들이 구독할 수 있게 해 줘요.

 

Subject는 Observable처럼 이벤트를 발행할 수 있고, Observer처럼 다른 Observable을 구독할 수 있어요.

그래서 Subject는 여러 Observer에게 동일한 이벤트를 전달하는데 유용하게 쓸 수 있어요.

 

일반적으로는 Subject는 여러 Observer가 동일한 데이터를 동시에 수신해야 할 때 사용돼요.

 

Subject는 4가지 종류의 Subject들이 있어요.

  1. PublishSubject: 구독이 시작된 이후 발생한 이벤트만을 전달
  2. BehaviorSubject: 구독 시점에 가장 최근의 이벤트를 전달하고(가장 마지막에 발행된 이벤트라고 생각하면 됨), 그 이후의 이벤트를 구독자에게 전달 
    • ex) (1, 2, 3, 4, 5, 6, 7) 순서로 이벤트가 발생할 때 4의 값을 전달하는 이벤트가 발행되었을 때 구독을 한다면 마지막 이벤트(가장 최근)인 4를 전달하고 이후에 발생하는 5, 6, 7 이 발생하는 이벤트를 전달.
  3. ReplaySubject: 구독자에게 지정된 수만큼의 이전 이벤트를 버퍼에 저장하여 전달
  4. AsyncSubject: Observable이 완료된 후, 마지막 이벤트만 전달
let subject = PublishSubject<String>()
subject.onNext("Hello")
subject.onNext("RxSwift")
subject.subscribe(onNext: { value in
    print(value)
})
subject.onNext("Welcome")

- PublishSubject는 Hello와 RxSwift이벤트를 발행하는데, 구독이 시작된 이후에는 Welcome이벤트만 전달되기 때문에 Welcome이벤트만 Observer가 수신함.

 


 

 

이번 에는 RxSwift의 핵심 요소인 Observable, Observer, Subject에 대해 간략하게 알아보았어요.

이 세 가지 개념은 RxSwift에서 데이터를 다루는 기본이 되며, 비동기 프로그래밍의 강력한 도구로 활용할 수 있어요.

 

다음 시간에는 Operator와 Schedulers를 알아보면 또 한 번 RxSwift에 한발 더 다가가 볼게요!

 

잘못된 부분 혹은 추가적으로 알려주실 부분 있으시면 언제든지 댓글 남겨주세요.💬

감사합니다.🙇🏻‍♂️