내용 정리
Subject는 옵저버블과 옵저버 사이의 다리 역할을 한다. 즉, 이벤트를 방출하면서 동시에 외부에서 이벤트를 수신할 수 있다.
Subject의 유형 중 PublishSubject는 초기 상태가 비어있는 서브젝트로, 구독 이후에 발생한 이벤트만 옵저버에게 전달한다.
주로, 특정 시점 이후에 발생하는 이벤트만 전달하고자 하는 경우 사용한다.
let publishSubject = PublishSubject<String>()
publishSubject.onNext("Hello") // 구독 이전의 이벤트는 전달되지 않음
publishSubject.subscribe(onNext: {
print($0)
})
publishSubject.onNext("World") // 출력: World
Subject의 유형 중 BehaviorSubject는 하나의 초기 값을 가지며, 구독을 시작하면 가장 최근에 방출되었던 값을 받으며 구독을 시작한다.
let behaviorSubject = BehaviorSubject(value: "Initial")
behaviorSubject.subscribe(onNext: {
print($0)
})
behaviorSubject.onNext("Updated") // 출력: Initial, Updated
Subject의 유형 중 ReplaySubject는 구독자에게 특정 수의 이전 이벤트를 버퍼로 저장하여 전달한다.
즉, 과거의 데이터를 유지할 수 있기 때문에 새로운 구독자에게 구독 시점 이전의 데이터를 전달할 필요가 있는 경우 유용하게 사용할 수 있다.
let replaySubject = ReplaySubject<String>.create(bufferSize: 2)
replaySubject.onNext("One")
replaySubject.onNext("Two")
replaySubject.onNext("Three")
replaySubject.subscribe(onNext: {
print($0)
}) // 출력: Two, Three
Subject의 유형 중 AsyncSubject는 시퀀스가 완료된 후에 마지막 이벤트만 구독자에게 전달하는 서브젝트이다.
즉, 서브젝트가 onCompleted가 되면, 가장 최근의 이벤트를 구독자에게 전달하는 것이다.
let asyncSubject = AsyncSubject<String>()
asyncSubject.onNext("Hello")
asyncSubject.onNext("World")
asyncSubject.onCompleted() // 구독자가 마지막 값인 "World"만 받음
내용 정리
Relay는Subject와 비슷하게 옵저버블과 옵저버의 다리 역할로, 양쪽의 역할을 모두 수행할 수 있지만, 이벤트를 종료하지 않는다는 특징을 가진다.
즉,Relay는onCompleted,onError를 방출하지 않고 항상 이벤트를 전달할 수 있는Subject의 변형이고, 이는 RxCocoa의 객체이다.
PublishRelay는 PublishSubject와 유사하지만, 종료 이벤트를 지원하지 않는다.
let publishRelay = PublishRelay<String>()
publishRelay.accept("Event 1") // 이벤트 방출
publishRelay.subscribe(onNext: {
print($0)
})
publishRelay.accept("Event 2") // 출력: Event 2
BehaviorRelay는 BehaviorSubject와 유사하여 초기 값을 가진다. 주로 상태를 저장하고, 상태 관리에 많이 사용된다.
PublishRelay와 마찬가지로 종료 이벤트를 지원하지 않는다.
let behaviorRelay = BehaviorRelay(value: "Initial Value")
behaviorRelay.accept("Updated Value") // 값 업데이트
behaviorRelay.subscribe(onNext: {
print($0)
}) // 출력: Updated Value
ReplayRelay는 ReplaySubject와 유사하며 지정된 버퍼 크기만큼 이벤트를 저장하는 특징을 가진다.
다만, 다른 릴레이와 마찬가지로 종료 이벤트를 지원하지 않는다.
let replayRelay = ReplayRelay<String>.create(bufferSize: 2)
replayRelay.accept("First")
replayRelay.accept("Second")
replayRelay.accept("Third")
replayRelay.subscribe(onNext: {
print($0)
}) // 출력: Second, Third
내용 정리
RxCocoa는 RxSwift를 기반으로 한 UIKit 및 Cocoa의 확장 라이브러리이다. 주로 UI 요소와 반응형 코드를 연결하는데 사용되며, RxSwift와 함께 동작한다.
RxSwift와 다른 점은, RxSwift가 Swift에 대한 Rx 프로그래밍을 지원한다면, RxCocoa는 iOS, macOS에 대해 Rx 프로그래밍을 지원하는 도구이다.
RxCocoa는 아래와 같은 특징을 갖는다.
Driver와 같은 Traits와 함께 사용된다UIKit에서 RxCocoa를 import하면 버튼이나 레이블 등의 UI 요소를 옵저버블로 변환하여 사용할 수 있다.
예를 들어 UITextField와 UILabel을 바인딩하여 사용할 수 있다.
let textField = UITextField()
let label = UILabel()
textField.rx.text.orEmpty
.bind(to: label.rx.text)
.disposed(by: disposeBag)
또, 버튼의 클릭 이벤트를 바인딩하여 사용할 수 있다.
let button = UIButton()
button.rx.tap
.subscribe(onNext: {
print("Button tapped")
})
.disposed(by: disposeBag)
Traits란 RxCocoa의 고수준 타입으로, Driver, Signal 등 UI 작업에서 안전하게 사용할 수 있는 타입이다.
얼핏보면 옵저버블과 유사하지만, 특정 컨텍스트에서 더 안전하고 직관적으로 사용할 수 있도록 설계된 타입이다.
let observable = Observable.of(1, 2, 3)
let driver = observable.asDriver(onErrorJustReturn: 0)
driver.drive(onNext: {
print($0)
})
오늘은 RxSwift에 대해서 남은 정리를 모두 마쳐보았다.
RxCocoa에 대해 배웠는데,
SwiftUI에서 쓰던 형식과 유사한 느낌이라 좀 더 공부해보고 싶다는
생각이 들었다.
추후 RxCocoa에 대해 더 자세히 공부를 해봐야겠다.