[RxSwift] Subject

jinny·2022년 10월 12일
1

RxSwift

목록 보기
1/10
post-thumbnail

Subject


📚 개념

  • Observer인 동시에 Observable이다.
  • Observable과 달리 onNext()를 통해 event를 방출할 수 있다.
  • Observer들과 Multicast로 연결되어 있어 모든 Observer들에게 한 번에 event를 방출할 수 있다.
  • 종류로는 PublishSubject, BehaviorSubject, ReplaySubject가 있다.

💡 Subject - Observer
: Multicast 방식 (1:n 방출-구독)

💡 Observable - Observer
: Unicast 방식 (1:1 방출-구독)


🏷 참고 사이트






PublishSubject

📚 개념

  • Observer가 해당 Subject를 구독한 이후에 Observable에 의해 방출된 항목들만 Observer에게 방출한다. (생성 이후 항목을 방출할 수 있다.)
  • Observable이 오류로 종료되면 관찰자에게 항목을 내보내지 않고 Observable의 오류 알림을 전달한다.

✏️ 예시) PublishSubject 사용방법

// 실행코드
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()

subject.onNext("Issue 1")

subject.subscribe { event in
    print(event)
}

subject.onNext("Issue 2")
subject.onNext("Issue 3")

//subject.dispose() // 스트림 종료

subject.onCompleted() // 완료

subject.onNext("Issue 4")
// 결과
next(Issue 2)
next(Issue 3)
completed

🏷 참고 사이트






BehaviorSubject

📚 개념

  • Observer가 해당 Subject를 구독하면 Observable에서 가장 최근에 내보낸 항목(또는 아직 내보내지 않은 경우에는 default value)을 방출을 시작으로, Observable에서 다른 항목을 계속 방출한다.
  • Observable이 오류로 종료되면 PublishSubject와 같이 관찰자에게 항목을 내보내지 않고 Observable의 오류 알림을 전달한다.

✏️ 예시) BehaviorSubject 사용방법

// 실행코드
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "Initial Value")

subject.onNext("Last Issue")

subject.subscribe { event in
    print(event)
}

subject.onNext("Issue 1")
// 결과
next(Last Issue)
next(Issue 1)

🏷 참고 사이트






ReplaySubject

📚 개념

  • Observer가 해당 Subject를 구독한 시기에 관계없이 Observable에서 방출한 모든 항목을 Observer에게 방출한다. (구독 시 기존에 등록된 onNext() event를 다시 구독한다.)
  • 재생버퍼가 특정크기 이상으로 커질 위험이 있거나, 항목이 방출된 이후 지정된 기간이 경과하게 되면 오래된 항목을 버리는 버전도 존재한다.
  • Observer로 사용할 경우, 여러 스레드에서 onNext()를 사용하면 비순차적으로 호출되어 결과에 모호성이 발생하기 때문에 주의해야한다.

✏️ 예시) ReplaySubject 사용방법

// 실행코드
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 2) // subject가 가지는 buffer 사이즈를 지정한다.

subject.onNext("Issue 1")
subject.onNext("Issue 2")
subject.onNext("Issue 3")

subject.subscribe {
    print($0)
}

subject.onNext("Issue 4")

print("[Subscription 1]")

subject.subscribe {
    print($0)
}

subject.onNext("Issue 5")
subject.onNext("Issue 6")

print("[Subscription 2]")

subject.subscribe {
    print($0)
}
// 결과
next(Issue 2)
next(Issue 3)
next(Issue 4)
[Subscription 1]
next(Issue 3)
next(Issue 4)
next(Issue 5)
next(Issue 5)
next(Issue 6)
next(Issue 6)
[Subscription 2]
next(Issue 5)
next(Issue 6)

🏷 참고 사이트



💥 공부를 위한 정리글이기 때문에 잘못된 부분이 있을 수 있습니다. 💥

profile
우당탕탕 지니

0개의 댓글