정의: 데이터 스트림을 생성하고 이를 구독자에게 전달하는 기본 객체입니다.
특징:
단방향 데이터 흐름: 데이터를 생성하여 구독자에게 전달.
구독자가 없으면 데이터를 생성하지 않음 (지연 실행, lazy).
기본적으로 cold observable: 데이터 스트림이 구독자별로 독립적임.
데이터 스트림은 onNext, onError, onCompleted 이벤트를 통해 전달.
let observable = Observable.just("Hello, RxSwift")
observable.subscribe(onNext: { value in
print(value)
})
정의: Observable이자 Observer의 역할을 동시에 수행하는 객체.
특징:
Observable처럼 데이터를 전달하고, Observer처럼 외부에서 데이터를 수신할 수 있음.
Hot observable: 스트림이 공유되고, 구독자는 데이터가 방출된 시점 이후의 값만 수신.
여러 종류의 Subject가 존재:
PublishSubject: 초기값 없음. 구독 후 방출된 값만 전달.
BehaviorSubject: 초기값을 가짐. 가장 최근 값 또는 초기값을 새로운 구독자에게 전달.
ReplaySubject: 설정된 크기만큼의 버퍼를 유지. 구독 시 버퍼의 모든 값을 전달.
AsyncSubject: 스트림이 완료될 때 마지막 값만 전달.
let subject = PublishSubject<String>()
subject.onNext("First")
subject.subscribe(onNext: { value in
print(value)
})
subject.onNext("Second")
subject.onNext("Third")
정의: Subject의 변형으로, onError와 onCompleted 이벤트가 없으며, 값만 방출하는 객체. 보통 UI 이벤트 처리와 상태 관리에 사용.
특징:
종료되지 않는 스트림 (Error 및 Completed 이벤트 없음).
Hot observable: 구독자와 스트림을 공유.
RxSwift에서 제공하는 Relay:
PublishRelay: PublishSubject와 유사. 초기값 없음.
BehaviorRelay: BehaviorSubject와 유사. 초기값 및 최신 값을 유지.
주로 UI 이벤트 처리나 상태 관리에 사용.
let relay = BehaviorRelay(value: "Initial")
relay.accept("Updated")
relay.subscribe(onNext: { value in
print(value)
})
relay.accept("Final")
Observable, Subject, 그리고 Relay는 모두 RxSwift에서 반응형 프로그래밍을 구현할 때 사용하는 주요 구성 요소입니다. 이들의 차이는 데이터 스트림의 생성, 공유, 구독 방식에서 나타납니다. 아래는 각각의 특징과 차이점입니다.