Observables and Observers # 2

9495 단어 rxswiftrxswift

Observer가 Observable을 구독하고 이벤트를 처리하는 방법에 대해서..

핵심:

  1. Observable -> Observer로 이벤트가 전달되는 시점은 Observer가 Observable을 구독하는 시점이다.
  2. Observer는 한번에 두개 이상의 이벤트를 동시에 처리하지 않는다. 따라서, Observable은 Observer가 하나의 이벤트를 처리한 후에 이어지는 이벤트를 전달한다.

Observables and Observers # 1
Observables and Observers # 1 게시물에서 Observable을 생성하는 방법에 대해 글을 작성했다.
하지만 아직 Observer가 Observable을 아래 코드와 같이 구독하지 않은 상태이기 떄문에 이벤트를 발생시킬 수 없었다.

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

// #2
Observable.from([0,1])

어떻게 해야 Observer가 Observable을 구독할 수 있을까?

어떻게 Observer가 Observable을 구독할까?

  • subscribe 메소드를 이용해 구독
  • subscribe 연산자라고도 부를 수 있다.
  • subscribe 메서드가 Observer와 Observable을 연결시켜주는 역할을 한다.

:

let o1 = Observable<Int>.create { (observer) -> Disposable in
    observer.on(.next(0)) 
    observer.onNext(1) 
    observer.onCompleted()
    return Disposables.create()
}
// #1
o1.subscribe {
	 print($0)
    if let elem = $0.element{
        print(elem)
    }
}
// #2
o1.subscribe(onNext: ((Int) -> Void)?,
            onError: ((Error) -> Void)?,
            onCompleted:(() -> Void)?,
            onDisposed: (() -> Void)?
            )
// #2의 직접적인 사용 예
o1.subscribe(onNext: { elem in
    print(elem)
} )

#1은 옵저버가 옵저버블로 부터 전달 받은 이벤트를 받는다.
이벤트 안에 저장된 값에 접근하기 위해서는 옵셔널 바인딩하여 접근한다.
(이벤트에 저장된 값이 없을수도 있기 때문에)

#2 는 인자로 개별 이벤트별로 클로저를 받는다.
개별 이벤트들을 별도의 클로저에서 처리하고 싶을때 주로 사용하게된다.
(파라미터별로 기본값들이 nil 로 선언되어 있어서 처리하지 않는 이벤트 파라미터는 아래와 같이 생략해서 사용 가능하다.)

예시:

o1.subscribe(onNext: { elem in
    print(elem)
} )

#1 과 #2 의 차이점

  • 클로저 파라미터로 next이벤트에 저장된 요소가 바로 전달된다. 그래서 element속성에 접근할 필요가 없다. 출력해보면 next이벤트로 전달된 요소들만 출력된다.

#1의 출력 결과

#2의 출력 결과

위의 결과에서 볼 수 있듯이,

  • #1에서는 next이벤트가 출력이 되고 그 이벤트에 접근해 안에 저장되어있는 값에 접근할 수 있다.

  • #2에서는 이벤트 next이벤트에서 자체적으로 처리하기 때문에 Next이벤트 안에 저장되어 있는 값에 직접적으로 접근이 가능했다.

좋은 웹페이지 즐겨찾기