RxSwift 3일차 - Rx 3요소 - Opservables

wormsJJG·2022년 9월 22일
0

RxSwift

목록 보기
3/4

Observable

오늘은 rx의 핵심인 Observable을 알아보려고 한다.

Rx에서 가장 먼저 이해해야할 사항은 관찰자 패턴 (Observable <요소> 시퀀스), 시퀀스라는 개념과 동등하가는 걸 알아야한다.

이는 모든 Obervable 객체는 또 하나의 시퀀스이며 모든 Obervable 흐름은 일련의 순서대로 신호를 방출하는 것이 기본 핵심이다. 그러한 순서는 비동기적으로 구독을 하는 대상에게 전달될 수 있으며 선택적으로 특정한 조건에 따라 전달될수 있다.

class Observable<Element> {
    func subscribe(_ observer: Observer<Element>) -> Disposable
}

protocol ObserverType {
    func on(_ event: Event<Element>)
}

enum Event<Element>  {
    case next(Element)      // next element of a sequence
    case error(Swift.Error) // sequence failed with error
    case completed          // sequence terminated successfully
}
  • Observable == Sequence
  • Observable은 다양한 타입을 지원 -> 제네릭 형태를 취하는 이유
  • Observable은 subsribe 메소드는 시퀀스의 makeIterator 메소드와 동일
  • subscribe 연산자를 실행하여야만 구독자가 될수 있고, 이벤트 수신이 가능
  • Observable의 이벤트는 기본적으로 next, error, completed 등 세가지가 있음
  • 모든 흐름은 비동기적으로 동작
  • Observable == observable sequence == Sequence 모두 다같음

Sqeuence

아래와 같이 다양한 상황에서 데이터가 순서대로 전달되는 형태

  • 1부터 3까지 데이터가 구독자에게 방출되고 종료

    --1--2--3--|

  • a,b,a,d 데이터가 전달 된 후 에러를 만나서 종료

    --a--b--a--d--X

  • tap,tap,tap을 불특정한 시간 간격으로 계속 전달되는 형태

    --tap-tap------tap--->

Observable 객체의 생명주기

  • Observable 객체를 선언하고 데이터 리스트를 입력받음
  • Observable 객체를 구독하기 위해서는 subsribe를 통해 구독을 시작
  • Observable은 어떤 구성요소를 가지는 next이벤트를 최신 값을 계속해서 방출할 수 있다.
  • Observable은 error이벤트를 방출해서 완전 종료 가능
  • Observable은 complete 이벤트를 방출하여 완전 종료 가능
let subscription = Observable.of(1,2,3).subscribe(onNext: {
            print($0)
        }, onCompleted: {
            print("completed")
        })
        
        subscription.dispose()

이 코드는 아까 위에서 살펴본 예제의 1부터 3까지 데이터가 구독자에게 전달하고 마무리하는 예시다.

마지막 부분 dispose() 연산자는 구독을 취소하고 종료한다는 코드이다.
반드시 모든순서에 사용 완료 후에는 dispose를 호출해야 동시에 정상적으로 구독취소와 메모리가 해제된다.

Disposing

위에서 특정 구독자에 대해 dispose를 호출해 정상적으로 구독을 취소하고 메모리 해제를 하는 코드를 보았다.
하지만 여러 구독자마다 개별로 dispose를 호출하는 것은 매우 비효율적이다.

따라서 DisposeBag이라는 개체를 통해 다수의 구독자들의 구독을 종료할수있다.

let disposeBag = DisposeBag()
        
        let subscription = Observable.of(1,2,3).subscribe(onNext: {
            print($0)
        }, onCompleted: {
            print("completed")
        }) .disposed(by: disposeBag)

참고 자료

profile
IOS DEV

0개의 댓글