Observable<Int>.create { (observer) -> Disposable in
observer.on(.next(0))
observer.onNext(1)
observer.onCompleted()
return Disposables.create()
}
.take(1)
Observable.from([1, 2, 3])
create로 만들어진 Observable은 2개의 정수를 방출하고 종료된다. 하지만 이상태에선 어떤 이벤트도 전달되지 않는다.
단순히 Observable이 생성되어 있는 상태이다.
이렇게 만들어진 Observable에서 연산자를 호출하더라도 Event는 전달되지 않는다. 이 코드 역시 Event가 구독자에게 전달되는 방식을 정의할 뿐이다.
실제로 Event가 전달되는 시점은 Observer가 구독을 시작하는 시점이다.
Observable는 Event를 Observer로 전달한다.
Observer는 Observable에서 전달된 Event를 처리한다. 이것을 구독한다고 표현한다.
Observer가 구독을 시작하는 방법은 Observable에서 subscribe메서드를 호출하는 것이다.
subscribe메서드 역시 subscribe연산자라고 부르기도 한다.
subscribe는 Observer와 Observable를 연결한다.
두 요소를 연결해야 Event들이 전달되므로 RxSwift에서 가장 기초적이고 필수적인 작업이다.
첫 번째 Observable에 Observer를 추가하고 구독해본다. 또한 가독성을 위해 Observable을 상수에 저장한다.
let o1 = Observable<Int>.create { (observer) -> Disposable in
observer.on(.next(0))
observer.onNext(1)
observer.onCompleted()
return Disposables.create()
}
o1.subscribe{
//이 메서드는 클로저를 파라미터로 받는다.
//이 클로저로 Event가 전달되고, 여기에서 Event를 처리한다.
//바로 이 클로저가 옵저버다
print($0)
}
//결과:
//next(0)
//next(1)
//completed
nextEvent에는 0과 1이 저장되어있다.
이 값을 꺼내어 사용하고 싶다면 이렇게 구현한다.
o1.subscribe{
if let elem = $0.element{
print(elem)
}
}
//결과:
//0
//1
Event에 저장되어 있는 값은 element속성을 통해 얻어올 수 있다.
형식이 Optional이기 때문에 옵셔널 바인딩이 필요하다.
하나의 클로저를 통해 모든 이벤트를 처리할 때에는 이렇게 구현한다.
o1.subscribe(onNext: <#T##((Int) -> Void)?##((Int) -> Void)?##(Int) -> Void#>,
onError: <#T##((Error) -> Void)?##((Error) -> Void)?##(Error) -> Void#>,
onCompleted: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>,
onDisposed: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)
//Event 별로 클로저를 받는다. 개별 Event를 별도의 클로저에서 처리하고 싶을 때 사용된다.
//파라미터는 기본값이 nil로 선언되어 있어서 필요하지 않은 Event에 대한 파라미터는 생략할 수 있다.
o1.subscribe(onNext: { elem in
print(elem)
})
//클로저 파라미터로 NextEvent에 전달된 파라미터가 바로 전달된다.
//그래서 위처럼 elemet속성에 접근할 필요가 없다.
중요
옵저버는 동시에 2개이상의 이벤트를 처리하지 않는다.
Observable은 옵저버가 하나의 이벤트를 처리한 후에 이어지는 이벤트를 전달한다.
여러 이벤트를 동시에 전달하지 않는다.