RxSwift를 공부해보자의 마지막 포스팅이 될 것 같네요.
그래도 RxSwift 시리즈는 추후에도 계속됩니다.(언제가 될지 모르지만)
Side effect란 함수를 호출했을 때 반환값 이외에 함수 내부의 코드가 외부에 영향을 미치는 것을 말합니다.
RxSwift에서는 함수 대신 Observable을 말하겠네요.
RxSwift를 공부해보자 (2)에서 나온 예제 코드를 조금 변형하여 설명하겠습니다.
clearTapObservable
.do(onNext: {
self.clearButton.isEnabled = false
})
.map({ _ -> String in
return ""
})
.subscribe(onNext: { clear in
textField.text = clear
label.text = clear
.disposed(by: disposeBag)
위 코드에서 clearTapObservable이라는 Observable의 코드 내부에서 외부에 영향을 미치는 코드는 clearButton의 사용 가능 여부를 설정하는 do와 textField와 label의 text를 초기화 시켜주는 subscribe가 Side effect를 발생시킵니다.
Hot Observable과 Cold Observable은 데이터가 언제 방출되느냐에 따라 달라집니다.
Hot Observable은 생성되자마자 값을 방출합니다.
Cold Observable은 관찰자가 구독을 할 때까지 기다렸다가 값을 방출합니다.
Subject는 관찰자와 Observable의 역할을 모두 다 합니다.
관찰자이기 때문에 Observable을 구독할 수 있고, 동시에 Observable이기 때문에 받은 데이터를 변환하여 다시 방출할 수 있습니다.
또한 Subject는 Cold Observable을 Hot Observable로 바꿀 수 있습니다.
Subject의 4가지 종류
이 중 가장 많이 사용하는 PublishSubject와 BehaviorSubject를 설명하겠습니다.
BehaviorSubject는 기본값을 가지는 Subject입니다.
var Asubject = BehaviorSubject<String>(value: "A")
//...
Asubject
.take(1)
.subscribe(onNext: { [weak self] s in
print(s)
self?.Asubject.onNext(s + "B")
})
.disposed(by: disposeBag)
//"A"
위와 같이 기본값인 A를 받아 출력하고 외부에서 Subject로 접근하여 데이터를 방출할 수 있습니다.
PublishSubject는 BehaviorSubject와 달리 기본값을 가지지 않고 구독 이후에 source Observable에 의해 방출되는 값만 관찰자에게 방출합니다.
var Bsubject = PublishSubject<String>()
//...
Bsubject
.onNext("A")
Single은 단일 요소 또는 오류를 방출하는 Observable의 변형입니다.
Maybe는 Single과 Completable의 중간과 같습니다.
이렇게 RxSwift에 기본적인 정리는 끝이 났네요.
Rx 코드를 읽고 따라 하듯이 Rx로 코드를 짜던 때보다 포스팅으로 한번 정리를 하니, 두루뭉술하게 이해하고 쓰던 코드들이 이해가 되는 시간이었던 것 같습니다.
그리고 아직은 나에게 Rx는 이른 건가?라는 생각도 드네요..ㅎㅎ
3월 안에 프로젝트 포스팅으로 돌아오겠습니다.