[RxSwift] Observable(1)

나는 사과·2021년 4월 25일
0

RxSwift

목록 보기
3/8

Observable 생명주기

marble diagrams를 이용해서 시간 흐름에 따라 값을 표현하는 방식으로 생명주기를 알아볼 수 있다. 시간은 왼쪽에서 오른쪽으로 흐른다.


next 이벤트를 통해서 각각의 요소(1,2,3)을 방출하는 그림.


3개의 tap 이벤트가 방출된 뒤 완전 종료된 그림. 이것을 completed 이벤트라 함.


1,2 요소가 방출된 뒤에 에러가 발생하고 완전 종료되었지만 error 이벤트를 통해 종료된 그림.

위 3개의 그림을 통해서 Observable은 next이벤트를 통해서 계속해서 방출할 수 있으며 completeerror이벤트를 방출해서 완전 종료된다.

방출이란? Observable이 계속해서 이벤트를 생성하는 과정을 뜻하는 표현

Observable 생성

아래와 같이 3가지 방식으로 Observable을 생성할 수 있다.

1.just : 단 하나의 요소를 갖는 Observable 생성
2. of : 주어진 값을 타입추론해서 Observable 생성
3. from : Array요소만 하나씩 방출해서 Observable 생성

Observable 구독

생성만 하면 마치 인스턴스 객체 생성하기 전 클래스 처럼 정의만 되어있고 아무런 행동을 하지않는다. 그래서 이벤트를 방출하기 위해서는 구독(Subscribe)를 해야한다.

  1. .subscribe()
    위에 잠깐 봤던 것 처럼 next()이벤트로 요소들을 방출하면서 마지막에 completed이벤트가 방출됐다.

  2. .subscribe(onNext:)
    일반적인 subscribe와 다르게 next이벤트만 취해서 핸들링하겠다는 의미로 다른 이벤트들은 모두 무시하게 된다. 출력에서도 next(1) 이런 형식이 아닌 값만 출력된다.

Observable.subscribe(onNext: { (value) in 
    print(value)
})
// 1
// 2
// 3
  1. .empty()
    요소를 하나도 갖지 않는 Observable을 생성할 때 사용된다. 요소가 없기 때문에 completed 이벤트만 방출된다. 주의해야할 점으로는 요소가 없어서 타입추론이 불가능하기 때문에 반드시 타입을 명시해주어야 한다.
    요소가 없는데 왜 사용할까?
    의도적으로 요소가 0개인 Observable을 리턴하고 싶거나 즉시 종료할 수 있는 Observable을 리턴하고 싶을 때 .empty()를 사용할 수 있다.
let observable = Observable<Void>.empty()

Observable.subscribe(onNext: { (value) in 
    print(value)
})
// Completed

위 예제처럼 .empty() 구독한 Observable은 Completed 이벤트만 방출한다.

  1. .never()
    .empty()와 반대로 completed조차 출력되지 않는다.
let observable = Observable<Void>.never()
  1. .range()
    매개변수로 갖는 start부터 count크기만큼의 값을 갖는 Observable을 생성한다.
let observable = Observable<Int>.range(start: 1, count: 5)

observable.subscribe(
    onNext: { (value) in
        print(value)
    }
)
// 1
// 2
// 3
// 4
// 5

0개의 댓글