[Swift] RxSwift를 통한 비동기 프로그래밍(2)

Charlie·2022년 9월 4일
0

Observable

Observable은 이벤트 시퀀스를 비동기적으로 생성한다. Observable이 지속적으로 이벤트를 발생시키는 것을 emit이라고 한다.
Observable이 방출할 수 있는 이벤트들로는 다음 3가지가 있다.

  • next : 최신 값을 방출하는 이벤트
  • error : observable이 값을 방출하다 에러가 발생하면 error를 방출하고 종료시키는 이벤트
  • complete : 성공적으로 이벤트 시퀀스를 종료시키는 이벤트

Observable 만들기

  • just는 오직 하나의 요소를 포함하는 시퀀스를 생성한다.
let observable: Observable<Int> = .just(1)
  • of는 주어진 값들을 가지고 시퀀스를 생성한다.
let observable = Observable.of(1, 2, 3)		// Observable<Int>
let observable = Observable.of([1, 2, 3])	// Observable<[Int]>
  • from은 배열의 요소들로 시퀀스를 생성한다.
let observable = Observable.from([1, 2, 3])
  • 'create()'을 통해 생성할 수 있다.
  Observable<String>.create({ (observer) -> Disposable
  	observer.onNext("1")
  	observer.onCompleted()
  	observer.onNext("2")
  	return Disposables.create()
  })

이 때 2가 들어가는 이벤트는 complete 이후이기 때문에 방출되지 않는다.

Subscribing

Observable은 그저 시퀀스일 뿐이다. subscribe가 되기 전에는 아무런 이벤트를 방출하지 않는다.
.subscribe()는 escaping 클로저로 Event를 갖는다. escaping에 대한 리턴값은 없으며 Disposable을 반환한다.
onNext, onError, onCompleted, onDisposed 를 통해 이벤트를 다룰 수 있다.

Disposing

Observable이 subscribe 되면 이벤트 방출을 시작하는 반면, disposing이 되면 종료된다.

  • .dispose() : Observable 구독을 취소
  • DisposeBag() : 각각의 구독에 대해서 일일이 관리하는 것은 효율적이지 못함.
    Disposable은 DisposeBag 인스턴스의 deinit()이 실행될 때 dispose()를 호출한다.

Traits

Trait는 일반적인 Observable보다 좁은 범위의 Observable이다.

Single

무한한 이벤트 스트림이 아닌 하나의 결과, 에러를 처리하고자 할 때 사용한다.

  • success(value) 또는 error 만 방출

  • success(value)nextcompleted 이벤트의 조합

  • HTTP 요청처럼 한 번의 응답, 에러를 처리할 때 사용

    Completable

    결과값이 필요하지 않고 완료만 의미 있는 모델에서 사용

  • completed 또는 error 만 방출

  • 연산이 성공적으로 완료되었는지 확인하고 싶을 때 사용

    Maybe

    Single과 Completable의 중간 포지션

  • success(value), completed, error를 방출

  • Observable을 asMaybe()를 통해 변형 가능

Hot, Cold Observable

Hot Observable

생성과 동시에 이벤트를 방출하기 시작하는 Observable. Subscribe되는 시점과 상관없이 Observer에게 이벤트를 중간부터 방출한다.

Cold Observable

Subscribe 되는 시점부터 이벤트를 생성해 방출한다.

Subject

Observable인 동시에 Observer이다. Subject를 사용하면 Cold Observable을 Hot Observable로 변환할 수 있다.

Publish Subject

  • subscribe 된 이후부터 이벤트를 방출한다.

  • dispose되거나 completed, error 이벤트를 통해 Subject가 종료될 때 까지 이벤트를 방출한다.

  • 종료되었을 때 존재하는 구독자 뿐만 아니라 이후에 구독한 subscriber에게도 종료 이벤트를 방출한다.

  • subscribe 되기 이전의 값이 필요 없는 경우에 사용한다.

    Behavior Subject

  • 초기 이벤트를 가진 Subject이다. subscribe될 때 가장 최신의 next 이벤트를 전달한다.

  • 초기값이 무조건 필요하다.

  • 유저 프로필과 같이 항상 최신 데이터가 필요한 경우에 사용한다.

    Replay Subject

  • buffer size 개의 이벤트를 저장해 subscribe 될 때 저장된 이벤트를 모두 방출한다.

  • 최근 검색어와 같이 최신의 여러 값들을 보여주고 싶을 때 사용한다.

Relay

Subject와 다르게 error나 complete를 통해서 종료되지 않는다
subscribe하고 싶을 때는 .asObservable()을 사용한다.

PublishRelay

  • PublishSubject를 wrapping해서 가지고 있다.

  • dispose되기 전까지 계속 작동하기 때문에 UI Event에서 사용하기 적절하다.

    BehaviorRelay

  • BehaviorSubject를 wrapping해서 가지고 있다.

  • .value를 사용해 현재의 값을 꺼낼 수 있다.

  • 단, value는 get-only-property이므로 value의 값을 변경하기 위해서는 .accept()를 사용한다.

Reference

KangHoon님 블로그

profile
Hello

0개의 댓글