Observable.from([0, 1])
지난 시간에는 두 개의 정수를 방출하고 종료하는 Observable을 생성했다. 하지만 그냥 Observable만 생성되었을 뿐이다. 다시 말해서 실제로 정수가 방출되거나 이벤트가 전달되지는 않는다. Observable은 그저 이벤트가 어떤 순서로 전달되어야 하는지(전달되는 방식을) 정의할 뿐이다.
그렇다면 Observable의 create의 클로저가 실행되는 시점, from 연산자가 실행되는 시점, 실제로 이벤트가 전달되는 시점은 언제일까? 바로 Observer가 Observable을 '구독'하는 시점이다. 이 시점에 next 이벤트를 통해서 두 정수가 순서대로 방출되고 이어서 completed 이벤트가 전달된다.
let o1 = Observable<Int>.create { (observer) -> Disposable in
// observer가 이벤트를 받고 있다.
observer.on(.next(0))
observer.onNext(1)
observer.onCompleted()
return Disposables.create()
}
Observer란 말 그대로 관찰자다. 지난 시간에 생성했던 create 연산자의 클로저 내부를 살펴보면 실제로 Observer가 이벤트를 받고 있는 모습을 볼 수 있다. 이렇게 Observer는 이벤트를 관찰하고 이어서 처리하는 클로저를 가지고 있다. 하지만 위에서 이야기했던 것처럼 이곳은 정의일뿐 실제 처리가 일어나지 않는다. 구독을 해야 된다.
o1.subscribe {
print($0)
}
Observer가 구독을 시작하는 방법은 Observable의 subscribe 메소드를 호출하는 것이다. 이 메소드는 Observable과 Observer를 연결하고 Observer 내부에 있는 이벤트에 따라 적절히 처리한다. 이 두 요소가 이벤트가 전달의 기초이므로 RxSwift에서 가장 필수!관계다.
위 코드의 결과로 next 이벤트에 0과 1이 저장된 형태로 전달되고 completed 이벤트도 전달된다. next 이벤트에 전달된 값을 꺼내서 사용하고 싶다면? 아래와 같이 사용하면 된다.
o1.subscribe {
if let elem = $0.element {
print(elem)
}
}
실행해보면, 0과 1이 출력되는 것을 알 수 있다. 이렇게 이벤트에 저장된 값은 element property를 이용해서 얻어낼 수 있다. 형식이 옵셔널이기 때문에 옵셔널바인딩이 당연히 필요! 아무튼 하나의 클로저로 모든 이벤트를 처리할 때는 이런 방식으로 구현한다.
o1.subscribe { int in
} onError: { error in
} onCompleted: {
} onDisposed: {
}
이 메소드는 이벤트별로 클로저를 가지고 있다. 개별 이벤트를 별도의 클로저로 처리하고 싶을 때 사용한다. 해당 메소드의 파라미터는 기본값이 nil로 설정되어 있어서, 처리하지 않은 이벤트는 생략 가능하다.
o1.subscribe(onNext: { elem in
print(elem)
})
위 클로저 중에 onNext 파라미터만 남겨놓은 것인데, 이 클로저의 파라미터로 next에 저장된 값이 바로 전달된다. 그렇기에 element 속성에 접근없이 바로 출력이 가능하다. 가장 많이 사용되는 방법이니 기억해놓자!