본문 바로가기

Swift/RxSwift

[🔥Rx뿌셔] Subject VS Observable

728x90

Subject VS Observable

Subject는 Observable과 Observer의 역할을 모두 할 수 있는 Observable이라고 생각하면 된다.

 

Observable이나 Subject모두 이벤트를 emit하므로 subscribe 할 수 있다. 

다만, subscribe에서 차이가 발생하는데, Subject는 multicast 방식이므로 여러 개의 Observer를 subscribe할 수 있다. 

단순 Observable은 unicast 방식이므로 observer 하나만을 subscribe할 수 있다. 

 

 

Observable - unicast

let observableInt = Observable<Int>.create { observer in
    observer.onNext(Int.random(in: 1...100))
    return Disposables.create()
}

observableInt
    .subscribe { value in
        print("observableInt \(value)")
    }
    .disposed(by: disposeBag)

observableInt
    .subscribe { value in
        print("observableInt \(value)")
    }
    .disposed(by: disposeBag)

위의 코드를 실행하게 되면 각각 다른 숫자가 출력된다.

 

왜 ??

observer가 해당 observable에 대해 독자적인 실행을 갖기 때문에 

동일한 observable 구독을 통해 생성된 두 개의 observer라고 해도 observable이 각각 실행되면서 observer에게 서로 다른 값이 가는 것이다. 

 

Subject - multicast

multicast가 된다는 것은 하나의 observable 실행이 여러 subscriber에게 공유되는 것을 말한다.

 

  let subjectInt = BehaviorSubject(value: 0)
  subjectInt.onNext(Int.random(in: 1...100))
  
  subjectInt
      .subscribe { value in
          print("subjectInt \(value)")
      }
      .disposed(by: disposeBag)
  
  subjectInt
      .subscribe { value in
          print("subjectInt \(value)")
      }
      .disposed(by: disposeBag)

구독해서 생성될 observer에게 observable의 동일한 실행이 간다.

observable의 실행이 공유되면서 같은 값이 프린트 되는 것을 확인할 수 있다.

 

 

정리하자면, observable에서 subscribe를 하면 이벤트로 전달되는 것은 항상 새로운 것이다.

subject에서 subscribe를 하면 이벤트로 전달 되는 것은 subscribe 전에 수행된 onNext 등의 하나의 공통된 것이다. 

 

Observable Subject
단순히 함수, state가 존재하지 않는다. state를 갖고, data를 메모리에 저장한다.
각각의 옵저버에 대해 코드가 실행된다. 같은 코드를 실행하지만, 모든 옵저버에 대해 오직 한번만 실행된다. 
data producer  data producer && consumer
하나의 옵저버에 대해 간단한 observable을 필요로 할 때 사용한다.  자주 데이터를 저장하고 수정할 때, 여러 개의 옵저버가 데이터를 관찰해야 할 때 사용한다. 

 

좀 더 자세한 비교는 .. 이후에 정리할 .. cold observable VS hot observable에서 .. 이어서 ..