[RxSwift] RxSwift를 공부해보자 (3)

Erick·2023년 3월 6일
0

RxSwift

목록 보기
3/3
post-thumbnail

[RxSwift] RxSwift를 공부해보자 (3)


RxSwift를 공부해보자의 마지막 포스팅이 될 것 같네요.
그래도 RxSwift 시리즈는 추후에도 계속됩니다.(언제가 될지 모르지만)

Side effect

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, Cold Observables

Hot Observable과 Cold Observable은 데이터가 언제 방출되느냐에 따라 달라집니다.

Hot Observable

Hot Observable은 생성되자마자 값을 방출합니다.

  • 마우스 이벤트, UI 이벤트, 현재 시간 등이 있습니다.
  • 데이터는 구독한 모든 관찰자 간에 공유됩니다.

Cold Observable

Cold Observable은 관찰자가 구독을 할 때까지 기다렸다가 값을 방출합니다.

  • HTTP 연결, TCP 연결, 비동기 작업 등이 있습니다.
  • 데이터는 구독한 관찰자마다 할당됩니다.

Subject

Subject는 관찰자와 Observable의 역할을 모두 다 합니다.
관찰자이기 때문에 Observable을 구독할 수 있고, 동시에 Observable이기 때문에 받은 데이터를 변환하여 다시 방출할 수 있습니다.
또한 Subject는 Cold Observable을 Hot Observable로 바꿀 수 있습니다.

Subject의 4가지 종류

  • AsyncSubject
  • PublishSubject
  • BehaviorSubject
  • ReplaySubject

이 중 가장 많이 사용하는 PublishSubject와 BehaviorSubject를 설명하겠습니다.

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

PublishSubject는 BehaviorSubject와 달리 기본값을 가지지 않고 구독 이후에 source Observable에 의해 방출되는 값만 관찰자에게 방출합니다.

var Bsubject = PublishSubject<String>()

//...
Bsubject
	.onNext("A")

Single

Single은 단일 요소 또는 오류를 방출하는 Observable의 변형입니다.

  • 정확히 하나의 요소 또는 error를 방출합니다.
  • Side effect를 공유하지 않습니다.

Completable

  • Completed 또는 error만 방출합니다.
  • Side effect를 공유하지 않습니다.

Maybe

Maybe는 Single과 Completable의 중간과 같습니다.

  • 단일 요소를 방출하거나 Completed를 방출하거나 error를 방출합니다.
  • Side effect를 공유하지 않습니다.

마치며

이렇게 RxSwift에 기본적인 정리는 끝이 났네요.
Rx 코드를 읽고 따라 하듯이 Rx로 코드를 짜던 때보다 포스팅으로 한번 정리를 하니, 두루뭉술하게 이해하고 쓰던 코드들이 이해가 되는 시간이었던 것 같습니다.
그리고 아직은 나에게 Rx는 이른 건가?라는 생각도 드네요..ㅎㅎ
3월 안에 프로젝트 포스팅으로 돌아오겠습니다.

profile
iOS Developer

0개의 댓글