적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[RxSwift] Observables & Observers

hongssup_ 2021. 5. 21. 16:45
반응형

Observables & Observers

(Observable = Observable Sequence = Sequence)

Observer는 Observable을 감시(구독)하고 있다가, 전달되는 이벤트를 처리.

Subscribe 메서드를 통해 Observer와 Observable을 연결.

Observable은 세 가지 이벤트를 전달. 옵저버는 다음 세가지 메서드를 구현. 

onNext 

Observable에서 발생한 새로운 이벤트는 Next 이벤트를 통해 구독자로 전달됨. 

Observable은 새로운 항목들을 방출(emission)할 때마다 이 메서드를 호출.  

Observable이 배출하는 항목을 파라미터로 전달받음. 

onError

Observable에서 에러 발생 시 onError 메서드를 통해 Error 이벤트가 전달됨. (notification)

이 메서드가 호출되면 onNext나 onCompleted는 더 이상 호출되지 않는다. 

오류 정보를 저장하고 있는 객체를 파라미터로 전달받음. 

onCompleted

Observable이 정상적으로 종료되면 전달(notification)되는 Completed 이벤트. 

 

Observerble의 라이프사이클 : 'Marble Diagram'을 통해 표현

옵저버블과 연산자의 동작을 시각적으로 표현해주어 쉽게 이해할 수 있음. 

 

Observerble 생성 방법

1. create 연산자 이용 (이벤트 전달 코드 직접 구현)

Observable<Int>.create { (observer) -> Disposable in
    observer.on(.next(0))
    observer.onNext(1)
    observer.onCompleted()
    return Disposables.create()
}

create 연산자는 observable 타입 프로토콜에 선언되어 있는 타입 메서드. 

하나의 클로저를 타입으로 받음. 

여기서 클로저는 observer를 받아 Disposable을 리턴

두개의 정수를 방출하고 종료하도록. 

옵저버에서 on 메서드를 호출하고 next 이벤트에 숫자 0을 담아서 전달. 

0이 저장되어 있는 next 이벤트가 구독자로 전달. 

Disposable은 메모리 정리에 필요한 객체. 

 

2. from 연산자 이용 (미리 정해진 규칙에 따라 이벤트 전달)

Observable.from([0,1])

파라미터로 전달한 배열에 있는 요소를 순서대로 방출하고 completed 이벤트를 전달하는 Observable 생성. 

단순히 순서대로 방출되는 observable을 생성할 때는 create 연산자로 직접 구현하는 것보다 from 같은 다른 연산자 활용하는 것이 좋음.

 

이렇게 생성된 observable은 옵저버가 observable을 구독하는 시점에 이벤트가 전달된다. 

 

Hot / Cold Obserbable

Observable에 따라 연속된 항목들을 방출하는 시기가 다르다. "Hot" Obserbable은 생성되자 마자 항목들을 배출하기도 하기 때문에, 이 Observable을 구독하는 옵저버들은 항목들이 배출되는 중간부터 Observable을 구독하게 될 수도 있다. 반대로 "Cold" Observable은 옵저버가 구독할 때까지 항목을 배출하지 않기 때문에 이 Observer를 구독하는 옵저버는 Observable이 배출하는 항목 전체를 구독할 수 있도록 보장받는다. 

"Connectable" Observable이라고 불리는 객체도 존재하는데, 이 Observable은 옵저버의 구독 여부와는 상관 없이 자신의 Connect 메서드가 호출되기 전까지 항목들을 배출하지 않는다. 

 

 

 

 

참고 : ReactiveX: Observable, https://github.com/kxcoding, KxCoding [Mastering RxSwift] #1

728x90
반응형

'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글

[RxSwift] Operators 연산자  (0) 2021.05.24
[RxSwift] Subject  (0) 2021.05.24
[RxSwift] ReactiveX  (0) 2021.05.20
SwiftUI  (0) 2021.05.15
[Swift] Stored and Computed Variables 저장/연산 프로퍼티  (0) 2021.04.09