Observable은 Observable Sequence 또는 Sequence라고 부르기도 한다.
RxSwift에선 모두 Observable을 나타내는 용어로 쓰인다.
Observable은 Event를 전달한다.
Observer는 Observable을 감시하고 있다가 전달되는 Event들을 처리한다.
Observer가 Observable을 감시한다는 것은 Observer가 Observable을 구독(Subscribe)한다고 한다.
그래서 Observer를 구독자(Subscriber)라고 부르기도 한다.
Observable은 3가지 Event를 전달한다.
Next Event
Observable에서 새롭게 발생된 Event는 Next Event를 통해서 구독자에게 전달된다.
Event에 값이 포함되어 있다면 NextEvent와 함께 전달된다.
이것을 RxSwift에선 Emission, 배출, 방출이라고 표현한다
Observable의 lifecycle동안 Event가 하나도 전달되지 않는 경우가 있고 하나 이상 전달되는 경우도 있다.
ErrorEvent
Observable에서 Error가 발생하면 ErrorEvent가 전달된다.
CompletedEvent
반면 Observable이 정상적으로 종료되면 CompletedEvent가 전달된다.
ErrorEvent와 CompletedEvent는 Observable의 lifecycle중에서 가장 마지막에 전달된다.
이후 Observable이 종료되고 모든 리소스가 정리되기 때문에 다른 이벤트는 전달되지 않는다.
보통 ErrorEvent와 CompletedEvent는 Emission이라고 부르지 않고 Notification이라고 부른다
Observable의 생성
Observable을 생성하는 방법은 크게 두가지가 있다.
1. create연산자를 통해서 Observable의 동작을 직접 구현하는 것이다
Observable<Int>.create { (observer) -> Disposable in
}
//create연산자는 Observable타입 프로토콜에 선언되어 있는 타입 메소드이다.
//RxSwift에선 이런 메소드를 연산자라고한다.
//이 연산자는 하나의 클로저를 파라미터로 받는다 이 클로저는 옵저버를 받아서 Disposable를 리턴한다
두개의 정수를 받아서 방출하도록 구현해본다
Observable<Int>.create { (observer) -> Disposable in
observer.on(.next(0))
//observer에서 on메서드를 호출하고 nextEvent에 숫자 0을 담아서 전달하도록 한다
//이렇게 되면 구독자에게 nextEvent에 0이 담긴 이벤트를 전달한다.
observer.onNext(1)
//onNext메서드를 사용하는 것도 가능하다.
//이번엔 1이 저장되어 있는 nextEvent가 전달된다.
observer.onCompleted()
//마지막으로onCompleted메서드를 호출하면 CompletedEvent가 전달되고 Observable이 종료된다
//이 후에 다른 Event를 전달할 수 없다.
return Disposables.create()
//마지막으론 Disposables을 return해야한다.
//Disposables은 메모리 정리에 필요한 객체이다.
}
2. from
앞에선 이벤트 전달 코드를 직접 구현했다. 이번에 사용할 연산자는 미리 정의된 규칙을 따라 이벤트를 전달한다.
from연산자를 통해 create로 구현한 Observable과 동일한 열할을 하는 Observable을 만든다.
Observable.from([0, 1])
//파라미터로 전달된 배열을 순서대로 전달하고 onCompleted를 호출한다.
//순서대로 방출하는 Observable을 만들 때에는 create보다 from과같은 다른 연산자를 통해 만드는 것이 좋다
지금까지는 Observable이 생성된 상태일 뿐이다. 정수가 방출되거나 Event가 전달되지 않는다.
Observable은 Event가 어떤 순서로 전달되어야 하는지 정의할뿐이다.
만들어 놓은 Observable에서 Event가 전달되는 시점은 언제인가?
바로 Observer가 Observable을 구독하는 시점이다.