오늘은 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
}
아래와 같이 다양한 상황에서 데이터가 순서대로 전달되는 형태
--1--2--3--|
--a--b--a--d--X
--tap-tap------tap--->
let subscription = Observable.of(1,2,3).subscribe(onNext: {
print($0)
}, onCompleted: {
print("completed")
})
subscription.dispose()
이 코드는 아까 위에서 살펴본 예제의 1부터 3까지 데이터가 구독자에게 전달하고 마무리하는 예시다.
마지막 부분 dispose() 연산자는 구독을 취소하고 종료한다는 코드이다.
반드시 모든순서에 사용 완료 후에는 dispose를 호출해야 동시에 정상적으로 구독취소와 메모리가 해제된다.
위에서 특정 구독자에 대해 dispose를 호출해 정상적으로 구독을 취소하고 메모리 해제를 하는 코드를 보았다.
하지만 여러 구독자마다 개별로 dispose를 호출하는 것은 매우 비효율적이다.
따라서 DisposeBag이라는 개체를 통해 다수의 구독자들의 구독을 종료할수있다.
let disposeBag = DisposeBag()
let subscription = Observable.of(1,2,3).subscribe(onNext: {
print($0)
}, onCompleted: {
print("completed")
}) .disposed(by: disposeBag)