웰코발
웰코's iOS
웰코발
전체 방문자
오늘
어제
  • 분류 전체보기 (63)
    • Swift (26)
    • rxSwift (13)
    • SwiftUI (3)
    • iOS (12)
    • 기타 (1)
    • 개발관련 용어정리 (6)
    • 면접준비 (0)
    • 공공데이터 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • delay
  • 디자인
  • rxswift
  • ios
  • Coordinator
  • collectionview
  • ReactorKit
  • WKWebView
  • 대기오염통계 현황
  • 측정소정보
  • cell
  • Scroll
  • SWIFT
  • Observable
  • content_available
  • UI
  • uitableview
  • alamofire
  • 주제구독
  • swiftUI

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
웰코발

웰코's iOS

[rxSwift] Subject 에 대한 이해와 종류
rxSwift

[rxSwift] Subject 에 대한 이해와 종류

2022. 10. 21. 20:52

Subject

  • 실시간으로 Observable에 새로운 값을 수동으로 추가하고, subscriber에 방출하도록 하는 것.
  • Hot Observable임.
  • Observable이자 Observer의 성격을 지니고 있음.
  • Observable의 성격으로 onNext의 형태로 수동으로 값을 추가할 수 있고
  • Observer의 성격으로 subscribe를 통해 방출함.

Subject 의 종류

 

  • PublishSubject

    • 빈 상태로 시작하여, subscribe 이후의 이벤트만을 subscriber를 통해 방출함.
    • PublishSubject는 .completed, .error 이벤트가 발생할때까지, 즉 종료될때까지 subscribe한 이후부터 이벤트를 방출.

  • PublishSubject 예시
let subject = PublishSubject<Int>()

let subjectOne = subject
    .subscribe(onNext: { (num) in
        print("subjectOne :",num)
    })

subject.onNext(1)
subject.onNext(2)

let subjectTwo = subject
    .subscribe(onNext: { (num) in
        print("subjectTwo :", num)
    })

subject.onNext(3)
subject.onNext(4)
subject.onNext(5)

/*
 subjectOne 구독 시점
 subjectOne : 1
 subjectOne : 2
 subjectTwo 구독 시점
 subjectOne : 3
 subjectTwo : 3
 subjectOne : 4
 subjectTwo : 4
 subjectOne : 5
 subjectTwo : 5
 */
let subject = PublishSubject<Int>()

let subjectOne = subject
    .subscribe(onNext: { (num) in
        print("subjectOne :",num)
    }, onError: { (error) in
        print("subjectOne Erorr: ",error)
    }, onCompleted: {
        print("subjectOne onCompleted")
    })

subject.onNext(1)
subject.onNext(2)

subject.onCompleted() // 추가

let subjectTwo = subject
    .subscribe(onNext: { (num) in
        print("subjectTwo :",num)
    }, onError: { (error) in
        print("subjectTwo Erorr: ",error)
    }, onCompleted: {
        print("subjectTwo onCompleted")
    })

subject.onNext(3)
subject.onNext(4)
subject.onNext(5)


/*
 subjectOne 구독 시점
 subjectOne : 1
 subjectOne : 2
 subjectOne onCompleted
 subjectTwo 구독 시점 (이미 subject가 completed 종료되어 onCompleted 방출)
 subjectTwo onCompleted
 */

 

 

  • BehaviorSubject

    • BehaviorSubject는 PublicshSubject와 유사하지만, 초기값을 가짐.
    • subscribe 직전의 하나의 이벤트를 포함한채 subscribe 이후 이벤트들을 subscriber를 통해 방출함.

  • BehaviorSubject 예시
let subject = BehaviorSubject(value: 5)

let subjectOne = subject
    .subscribe(onNext: { (num) in
        print("subjectOne :",num)
    }, onError: { (error) in
        print("subjectOne Erorr: ",error)
    }, onCompleted: {
        print("subjectOne onCompleted")
    })

subject.onNext(6)
subject.onNext(7)
subject.onNext(8)

let subjectTwo = subject
    .subscribe(onNext: { (num) in
        print("subjectTwo :",num)
    }, onError: { (error) in
        print("subjectTwo Erorr: ",error)
    }, onCompleted: {
        print("subjectTwo onCompleted")
    })

subject.onNext(9)
subject.onNext(10)

/*
subjectOne 구독 시점
subjectOne : 5  // 초기값 세팅
subjectOne : 6
subjectOne : 7
subjectOne : 8
subjectTwo 구독 시점
subjectTwo : 8  // 직전 값(8)을 초기값으로 세팅
subjectOne : 9
subjectTwo : 9
subjectOne : 10
subjectTwo : 10
 */

 

 

  • ReplaySubject

    • 버퍼를 두고 초기화하며, 버퍼 사이즈 만큼의 직전의 이벤트들을 포함한채 subscribe 이후 이벤트들을 subscriber를 통해 방출한다.
    • 생성 시 선택한 특정 크기만큼 일시적으로 캐시하거나 버퍼를 저장해서 최신 요소를 모두 방출
    • 예를 들면, 최근 검색어 같은 곳에서 사용

  • ReplaySubject 예시
let subject = ReplaySubject<Int>.create(bufferSize: 3)

subject.onNext(1)
subject.onNext(2)
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
subject.onNext(6)

let subjectOne = subject.subscribe(onNext: { (num) in
    print(num)
})

subject.onNext(7)
subject.onNext(8)
subject.onNext(9)

/*
4
5
6
subjectOne 구독 시점 (버퍼 사이즈 : 3 이므로 이전 onNext 4, 5, 6 값을 받을 수 있음)
7
8
9
 */

 

 

 

'rxSwift' 카테고리의 다른 글

[rxSwift] Filtering Operator 의 종류  (0) 2022.10.22
[rxSwift] Subject 를 wrapping한 Relay 사용법  (0) 2022.10.21
[rxSwift] Dispose 는 왜 하는 걸까?  (0) 2022.10.20
[rxSwift] Observable create 하는 법  (0) 2022.10.20
[rxSwift] Observable subscribe 하는 법  (0) 2022.10.19
    'rxSwift' 카테고리의 다른 글
    • [rxSwift] Filtering Operator 의 종류
    • [rxSwift] Subject 를 wrapping한 Relay 사용법
    • [rxSwift] Dispose 는 왜 하는 걸까?
    • [rxSwift] Observable create 하는 법
    웰코발
    웰코발
    나의 개발 일지

    티스토리툴바